我碰巧在沙盒Ruby环境中工作,并且一直在尝试使用混合结果向其中添加库。但是,它提出了一些关于Ruby如何工作的有趣问题。我想了解Ruby如何链接库以及它如何决定在启动时加载什么。
当我做
时发生了什么require 'someLib/someClass'
之前我需要.rb文件但是libs的行为不同。 如果需要像
这样的目录,需要如何工作require 'DL'
如何知道要加载的文件以及在解释器中注册的名称“DL”是什么?
P.S。:我现在必须使用的Ruby中唯一暴露的部分是'msvcrt-ruby18.dll'
答案 0 :(得分:3)
当您require 'something'
Ruby根据您的平台搜索名为something.rb
或something.dll/so/bundle
的文件时。
如果找到库dll/so/bundle
,它会动态加载它并搜索名为Init_something
的符号。创建本机扩展时的惯例是包含一个由ruby解释器用来连接的函数。
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
.
查看require(http://ruby-doc.org/core-1.8.7/classes/Kernel.html#M001077)
的文档我不确定你的意思:
P.S。 Ruby I中唯一暴露的部分 现在必须与之合作 'MSVCRT-ruby18.dll'
你还提到了一些关于沙盒的事情。这可能会影响您需要模块的能力。搜索$ SAFE,如果$ SAFE设置为> 2,您根本无法使用require
。
答案 1 :(得分:0)
Ruby使用内置的全局$:
(美元冒号),它是一个字符串数组,指定load
和require
使用的目录集。
当你require 'DL'
时,Ruby将搜索$:
,其中(至少在我的机器上,我通常在任何地方都期望)包括"c:/ruby/lib/ruby/1.8/i386-mswin32"
,这是安装Ruby的地方在这台PC上的c:/ruby
中)我找到dl.so
,这是包含DL功能的编译库。