关于编程Ruby 1.9中需要文件和加载路径的问题

时间:2011-06-24 19:49:48

标签: ruby require

我正在阅读“编程Ruby 1.9”。在页面208(在“测试的位置”部分中),该书的代码组织为

roman
    lib/
        roman.rb
        other files...
    test/
        test_roman.rb
        other_tests...
    other stuff

并询问我们如何让test_roman.rb文件了解roman.rb文件。

它说一个不起作用的选项是在测试代码中构建require语句的路径:

# in test_roman.rb
require 'test/unit'
require '../lib/roman'

相反,它说一个更好的解决方案是应用程序的所有其他组件假定应用程序的顶级目录在Ruby的加载路径中,以便测试代码具有

# in test_roman.rb
require 'test/unit'
require '/lib/roman'

我们会通过调用ruby -I path/to/app path/to/app/test/test_roman.rb来运行测试。

我的问题是:这真的是最好的方法吗?好像是

  1. 如果我们只是将第一个选项中的require '../lib/roman'替换为require_relative '../lib/roman',那么一切都会正常。
  2. 第二个选项中的假设(所有组件都在Ruby的加载路径中具有顶级目录)仅起作用,因为我们传递了-I path/to/app参数,这看起来有点乱。
  3. 我是否认为用require替换require_relative可以解决所有问题?是否还有理由不喜欢第二种选择?

2 个答案:

答案 0 :(得分:1)

require_relative确实使代码更清晰,但只能在Ruby上使用> 1.9.2。这意味着如果你想要你的代码可以移植到Ruby的版本< 1.9.2您需要使用扩展名或常规require AFAIK。这本书最有可能a)在1.9.2变得普遍之前写成或b)提供最低公分母的例子。

答案 1 :(得分:1)

此外,同一本书在测试环境中使用了require_relative(第16章,组织您的源代码),所以是的,我会说使用它是一个好东西,因为它“总是从相对于调用它的文件目录的路径加载文件”

当然,就像@christiangeek注意到的那样,require_relative是1.9系列中的新功能,但是gem提供了相同的功能。

可能值得指出的是,Pickaxe也提供了一个方法,你可以在我之前提到的同一章中坚持你的代码。