2009-08-25 7 views
0

私は、サンドボックスのRuby環境で作業していて、混合結果でライブラリを追加しようとしています。しかし、それはRubyがどのように動作するかについて興味深い質問を提起しています。私はRubyがどのようにライブラリをリンクしているのか、起動時に何をロードするかを決める方法を理解しています。私はRubyに関する非常に低いレベルの質問とライブラリへのリンク

require 'someLib/someClass' 

を行う際に何が起こっているか

私は前に.RBファイルを必要としていたが、動作がLIBSと異なっています。それは

require 'DL' 

はどのようにそれをロードするファイルのか分からない中でのようなディレクトリを必要としているように見え、どのようにインタプリタにその名「DL」が登録されている場合 は、どのような作業を必要としていますか?

P.S:私は今と仕事をしなければならないのRubyの唯一の露出した部分は、「MSVCRT-ruby18.dll」

答えて

3

あなたrequire 'something' Rubyはプラットフォームに応じてsomething.rbまたはsomething.dll/so/bundleどちらかと呼ばれるファイルを検索しています。

ライブラリが見つかった場合、dll/so/bundleは動的にロードし、Init_somethingというシンボルを検索します。ネイティブ拡張を作成する際の規約は、ルビインタープリタによって使用される関数を含めることです。

intrepeterはrbファイルを検索し、libsはロードパスによって決まります。これは、インタープリタの-Iオプションを使用して追加できます。実行時には、現在の負荷パスは、たとえば、(あなたにも、実行時にこれにさらにディレクトリを追加することができます)$:である:

$ irb 
irb(main):001:0> puts $: 
/opt/local/lib/ruby/site_ruby/1.8 
/opt/local/lib/ruby/site_ruby/1.8/i686-darwin9 
/opt/local/lib/ruby/site_ruby 
/opt/local/lib/ruby/vendor_ruby/1.8 
/opt/local/lib/ruby/vendor_ruby/1.8/i686-darwin9 
/opt/local/lib/ruby/vendor_ruby 
/opt/local/lib/ruby/1.8 
/opt/local/lib/ruby/1.8/i686-darwin9 
. 

は(http://ruby-doc.org/core-1.8.7/classes/Kernel.html#M001077)必要のドキュメントを見て

Iあなたが何を意味するのかわからない:

PS が今と仕事をしなければならないのRuby Iの唯一の露出部分は 「MSVCRT-ruby18.dll」です

また、あなたはサンドボックスについて何かを述べました。これはモジュールを必要とするあなたの能力を妨げることがあります。 $ SAFEを検索すると、$ SAFEが> 2に設定されていると、requireはまったく使用できなくなります。

+0

$ SAFE => 0;これはまさに私が探していたものです! – QueueHammer

0

Rubyは、loadrequireで使用される一連のディレクトリを指定して、文字列の配列である組み込みグローバル$:(ドルコロン)を使用します。

あなたがrequire 'DL'、Rubyが(少なくとも、私は一般的にどこにでも期待する私のマシン上)$:を、検索するである、"c:/ruby/lib/ruby/1.8/i386-mswin32"を含む場合、(RubyはこのPCにc:/rubyにインストールされている)私はdl.so、見つけますDL機能を含むコンパイル済みのライブラリです。