【发布时间】:2014-06-11 19:18:38
【问题描述】:
spec_helper.rb 的这两个代码有什么区别吗?
或者实际上做同样的事情?
$ << File.join(File.dirname(FILE), '..', 'lib')
Dir[File.join(File.dirname(__FILE__), '..', 'lib', '**/*.rb')].each {
|f| require f }
【问题讨论】:
spec_helper.rb 的这两个代码有什么区别吗?
或者实际上做同样的事情?
$ << File.join(File.dirname(FILE), '..', 'lib')
Dir[File.join(File.dirname(__FILE__), '..', 'lib', '**/*.rb')].each {
|f| require f }
【问题讨论】:
它们根本不等价。
File.join(File.dirname(FILE), '..', 'lib') 不起作用。正确的版本是File.join(File.dirname(__FILE__), '..', 'lib'),它获取该行所在文件的路径,并将它们与/(当然取决于您的操作系统)与'..' 和'lib' 连接起来。所以最后你会得到一个字符串(仅此而已),类似于'/location-of-the-file/../lib'
第二行是一个 Dir.glob(参见 http://ruby-doc.org/core-1.9.3/Dir.html#method-c-glob),它基于 File.dirname(__FILE__), '..', 'lib', '**/*.rb') 的输入字符串(它再次执行我上面描述的操作)。 Dir[string] 会生成一个包含与通配字符串匹配的所有文件(仅是一个字符串)的数组。在这种情况下,lib 目录中所有以.rb 结尾的文件(包括子目录)。然后代码遍历每个代表文件的字符串和require(将代码加载到当前文件中)。
【讨论】: