在ruby中需要一个文件在同一个目录下吗?

是否有一个简短的方法来要求位于同一目录(作为脚本执行)的文件?

require File.expand_path(File.dirname(__FILE__) + '/some_other_script') 

我读了require "my_script"require "./my_script"实际上将加载脚本两次(ruby不会认识到,它实际上是相同的脚本),这就是为什么build议File.expand_path的原因:如果它被使用每次脚本是必需的,那么它只会被加载一次。

对我来说,像Ruby这样简洁的语言似乎没有一个简短的解决scheme似乎很奇怪。 例如,Python只是有这个:

 import .some_other_module_in_the_same_directory 

我想我可以猴子补丁require …但这只是邪恶的! 😉

由于ruby1.9可以使用require_relative

只需要filename

是的,如果将它指定为filename./filename ,它会导入两次,所以不要这样做。 你没有指定.rb ,所以不要指定path。 我通常把我的应用逻辑的大部分放到一个lib文件中,然后在bin中有一个脚本,如下所示:

 #!/usr/bin/env ruby $: << File.join(File.dirname(__FILE__), "/../lib") require 'app.rb' App.new.run(ARGV) 

另一个好处是,如果加载应用程序逻辑不会自动开始执行,我觉得更容易进行unit testing。

即使从其他目录运行脚本,以上方法也是可行的。 然而,在同一个目录下,你所指的工作按预期工作,至less对于ruby 1.9来说,不会导致双重要求。

testa.rb

 puts "start test A" require 'testb' require './testb' puts "finish test A" 

testb.rb

 puts "start test B" puts "finish test B" 

运行'ruby testa.rb'会导致:

 start test A start test B finish test B finish test A 

但是,更长的表单将工作,即使从另一个目录(例如ruby somedir / script.rb)

把它放在一个标准的库目录(已经在你的默认加载path$:某个地方):

 # push-loadpath.rb if caller.first $: << File.expand_path(File.dirname(caller.first)) end 

那么,这应该工作

 % ls /path/to/ bin.rb lib1.rb lib2.rb #... % cat /path/to/bin.rb load 'push-loadpath.rb' require 'lib1' require 'lib2' #... 

caller可以访问当前的调用堆栈,并告诉你什么文件和位置,所以push-loadpath.rb使用它来添加load到加载push-loadpath.rb的文件。

请注意,您应该load文件,而不是require ,因此可以多次调用正文(每次要更改加载path一次)。

或者,你可以用一种方法包裹身体,

 # push-loadpath.rb def push_loadpath $: << File.expand_path(File.dirname(caller.first)) end 

这将允许你require它,并以这种方式使用它:

 % ls /path/to/ bin.rb lib1.rb lib2.rb #... % cat /path/to/bin.rb require 'push-loadpath' push_loadpath require 'lib1' require 'lib2' #...