2014年1月15日水曜日

rubyのクラスのソースファイルについて

simple_routerのinterface.rbで使われていたMacクラスはどういったクラスなのか調べるため、ソースファイルを探し方を調べてみました。
ただ残念ながら、ソースファイルを探す方法を見つけることができませんでした。

今回は探し方を調べている間に見つけたメソッドや変数が、どこかで役に立つかもしれないのでメモしておきます。
説明は、ほぼリファレンスのコピーです。

■superclassメソッド
親クラスを調べるメソッドです。
戻り値はクラス(Classオブジェクト)です。

親クラスがわかってもどのファイルに書いてあるかはわかりませぬ。

■__FILE__変数
現在のソースファイル名です。
フルパスとは限らないため、フルパスが必要な場合は File.expand_path(__FILE__) とする必要があります。

実行しているファイル名は調べられそうですが、クラスがどのファイルに書かれているかはわからなそうです。

■$0、$PROGRAM_NAME組み込み変数
現在実行中の Ruby スクリプトの名前を表す文字列です。

では試しに__FILE__と$PROGRAM_NAMEを使ってみます。

(Test1.rb)
puts __FILE__
puts $PROGRAM_NAME

$ ruby Test1.rb
Test1.rb
Test1.rb

実行したファイル名が表示されました。

■$:、$LOAD_PATH組み込み変数
rubyがロードするファイルのディレクトリやロードしたファイルを調べる方法です。
これもMacクラスがどのファイルに書かれているかはわかりません。

Kernel.#load や Kernel.#require がファイルをロードする時に検索するディレクトリのリストを含む配列です

以下は、ロードパスをコマンドラインから調べる方法です。

$ ruby -e 'puts $:'

実行してみると、このようにパスが表示されます。
$ ruby -e 'puts $:'
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/i686-linux
/usr/local/lib/site_ruby/1.8/i486-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/i686-linux
/usr/lib/ruby/1.8/i486-linux
.

■$"、$LOADED_FEATURES組み込み変数
Kernel.#require でロードされたファイル名を含む配列です。
Kernel.#require で同じファイルを 複数回ロードしないようにするためのロックとして使われます。

実行してみます。

(Test2.rb)
puts $LOAD_PATH
puts "--------------------"
puts $LOADED_FEATURES

$ ruby Test2.rb
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/i686-linux
/usr/local/lib/site_ruby/1.8/i486-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/i686-linux
/usr/lib/ruby/1.8/i486-linux
.
--------------------
enumerator.so


どうにも調べ方がわからないので、tremaのディレクトリ内を検索して見つけたのが「./ruby/trema/mac.rb」でした。
これですかね?

tremaがこのファイルを読み込んでいるのか確認してみます。

(Test3.rb)
class Test < Controller

  def start
    puts $LOAD_PATH
    puts "--------------------"
    puts $LOADED_FEATURES
  end

end


$LOADED_FEATURESの結果が長いので、一部省略します。
$ trema run Test3.rb
/var/lib/gems/1.8/gems/trema-0.3.20/vendor/ruby-ifconfig-1.2/lib
/var/lib/gems/1.8/gems/trema-0.3.20/ruby
/var/lib/gems/1.8/gems/bundler-1.3.5/lib
/var/lib/gems/1.8/gems/gli-2.6.2/lib
/usr/local/lib/site_ruby/1.8
/usr/local/lib/site_ruby/1.8/i686-linux
/usr/local/lib/site_ruby/1.8/i486-linux
/usr/local/lib/site_ruby
/usr/lib/ruby/vendor_ruby/1.8
/usr/lib/ruby/vendor_ruby/1.8/i686-linux
/usr/lib/ruby/vendor_ruby
/usr/lib/ruby/1.8
/usr/lib/ruby/1.8/i686-linux
/usr/lib/ruby/1.8/i486-linux
.
.
--------------------
enumerator.so
rubygems/defaults.rb
rbconfig.rb
rubygems/deprecate.rb
rubygems/exceptions.rb
<略>
trema/monkey-patch/integer.rb
trema/enqueue.rb
trema/send-out-port.rb
forwardable.rb
trema/mac.rb
trema/set-eth-addr.rb
trema/set-eth-dst-addr.rb
trema/set-eth-src-addr.rb
trema/set-ip-addr.rb
<略>

trema/mac.rbというのを読み込んでいるようです。
あくまで、参考まで。

0 件のコメント:

コメントを投稿