require 'digest/md5' # => true
Digest::Md5.hexdigest('') # => "d41d8cd98f00b204e9800998ecf8427e"
这需要使用哪个文件?是否需要实际文件?或者是否需要以编程方式?
答案 0 :(得分:2)
这是({3}}:
中解释的(sorta)要求(名称)→真或假
加载给定的
name
,如果成功,则返回true
,如果成功则返回false
该功能已加载。如果文件名没有解析为绝对路径,那么它就是 在
$LOAD_PATH
($:
)中列出的目录中搜索。如果文件名的扩展名为“.rb”,则将其作为源文件加载;如果 扩展名为“.so”,“。o”或“.dll”,或默认的共享库 在当前平台上的扩展,Ruby将共享库作为Ruby加载 延期。否则,Ruby会尝试添加“.rb”,“。so”等等 直到找到名字。如果找不到名为的文件,则会引发LoadError。
默认情况下,$LOAD_PATH
将包含Ruby标准库所在的目录。 Director ies ,复数,因为标准库中的本机(编译二进制)模块与纯Ruby模块位于不同的目录中。
Digest实际上是一个很好的例子,因为它的一些文件是原生的,而其他文件是Ruby。
在我的Mac上$LOAD_PATH
包括(以及其他)这两个目录(为了便于阅读而被截断):
.../usr/lib/ruby/2.0.0
.../usr/lib/ruby/2.0.0/universal-darwin15
前者是纯Ruby模块所在的位置,后者是原生模块所在的位置。
所以当我require 'digest/md5'
时,Ruby首先在.../usr/lib/ruby/2.0.0/
中查找名为digest/
的目录,并在找到它时,查找名为md5.rb
的文件。它找不到它,因此它会查找md5.bundle
。为什么.bundle
而不是.so
或.o
?因为那是"默认的共享库扩展" Ruby是在为OS X编译时配置的。转到图。
Ruby在那里找不到它,所以接着它在.../usr/lib/ruby/2.0.0/universal-darwin15/digest/
中查找。那里没有md5.rb
,但 是md5.bundle
,所以Ruby加载它。
答案 1 :(得分:1)
它加载了一个C-extension,可以在Ruby的源目录中找到 - ruby/ext/digest/md5/
答案 2 :(得分:1)
这是Ruby的标准库之一(stdlib),这意味着它几乎可以在Ruby的每个实现中使用。事实上,它确实加载了一个文件。但是,当您安装Ruby时,它是一个复制到您的计算机的文件,并且几乎总是可供您使用。标准库的另一个好例子是DateTime
。
当我开始学习Ruby和Rails时,有一件事让我很困惑,那就是Rails需要相当数量的Ruby标准库。因此,了解真正发生的事情是很好的。