0

我碰巧在沙盒 Ruby 环境中工作,并且一直在尝试向其中添加库,结果好坏参半。然而,它提出了一些关于 Ruby 如何工作的有趣问题。我希望了解 Ruby 如何链接库以及它如何决定在启动时加载什么。

当我做一个

require 'someLib/someClass'

我以前需要 .rb 文件,但行为与库不同。如果它看起来需要像 in 这样的目录,它是如何工作的

require 'DL'

它如何知道要加载哪些文件以及名称“DL”是如何在解释器中注册的?

PS:我现在必须使用的唯一暴露的 Ruby 部分是“msvcrt-ruby18.dll”

4

2 回答 2

3

当你require 'something'Ruby 搜索一个名为something.rb或者something.dll/so/bundle取决于你的平台的文件时。

如果它找到一个库dll/so/bundle,它会动态加载它并搜索一个名为Init_something. 创建本机扩展时的约定是包含这样一个函数,Ruby 解释器使用它来连接事物。

intrepeter 在哪里(在哪些目录中)查找 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 使用内置的全局$:(美元冒号),它是一个字符串数组,用于指定loadand使用的目录集require

当你require 'DL',Ruby 将搜索$:,其中(至少在我的机器上,我希望通常在任何地方)包括"c:/ruby/lib/ruby/1.8/i386-mswin32",这是我找到的(Ruby 安装在c:/ruby这台 PC 上)dl.so,包含 DL 功能的编译库。

于 2009-08-25T15:56:03.463 回答