如何要求'digest / md5'有效?

时间:2016-02-02 19:34:11

标签: ruby md5 require digest

require 'digest/md5'       # => true
Digest::Md5.hexdigest('')  # => "d41d8cd98f00b204e9800998ecf8427e"

这需要使用哪个文件?是否需要实际文件?或者是否需要以编程方式?

3 个答案:

答案 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包括(以及其他)这两个目录(为了便于阅读而被截断):

  1. .../usr/lib/ruby/2.0.0
  2. .../usr/lib/ruby/2.0.0/universal-darwin15
  3. 前者是纯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标准库。因此,了解真正发生的事情是很好的。