0

私はたまたまサンドボックス化されたRuby環境で作業しており、それにライブラリを追加しようとしましたが、結果はまちまちです。ただし、Ruby がどのように機能するかについて、いくつかの興味深い疑問が生じました。Ruby がライブラリをリンクする方法と、起動時に何をロードするかを決定する方法を理解しようとしています。

私がするとき何が起こっているのですか

require 'someLib/someClass'

以前は .rb ファイルが必要でしたが、ライブラリでは動作が異なります。次のようなディレクトリを必要としているように見える場合、require はどのように機能しますか?

require 'DL'

ロードするファイルをどのように認識し、その名前 'DL' がインタープリターにどのように登録されるのでしょうか?

追伸: 私が今作業しなければならない Ruby の公開部分は、「msvcrt-ruby18.dll」だけです。

4

2 に答える 2

3

Ruby は、プラットフォームに応じてまたはという名前のファイルをrequire 'something'検索します。something.rbsomething.dll/so/bundle

ライブラリが見つかった場合、dll/so/bundleそれを動的にロードし、 というシンボルを検索しますInit_something。ネイティブ エクステンションを作成するときの慣例は、Ruby インタープリターが接続するために使用する関数を含めることです。

インタープリターが rb ファイルを検索する場所 (どのディレクトリ) とライブラリは、インタープリターの -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
.

require のドキュメントを見てください ( http://ruby-doc.org/core-1.8.7/classes/Kernel.html#M001077 )

私はあなたが何を意味するのか分かりません:

PS私が今作業しなければならないRubyの唯一の公開部分は「msvcrt-ruby18.dll」です

また、サンドボックスについて何か言及しました。これにより、モジュールを要求する機能が妨げられる可能性があります。$SAFE を検索します。$SAFE が >​​2 に設定されている場合は、まったく使用できませんrequire

于 2009-08-25T15:48:58.673 に答える
0

Ruby は組み込みのグローバル$:(ドルコロン) を使用します。これは文字列の配列であり、loadおよびで使用されるディレクトリのセットを指定しrequireます。

するとrequire 'DL'、Ruby は$:、(少なくとも私のマシンでは、通常はどこにでもあると思います) を検索します。そこには、(Ruby はこの PC に"c:/ruby/lib/ruby/1.8/i386-mswin32"インストールされています)が含まれており、DL 機能を含むコンパイル済みのライブラリが見つかります。c:/rubydl.so

于 2009-08-25T15:56:03.463 に答える