在ruby中,有没有一种更简单的方法要求文件位于同一目录中?

在ruby中,有没有一种更简单的方法要求文件位于同一目录中?,ruby,path,require,Ruby,Path,Require,是否有一种更短的方法要求文件位于同一目录中(与正在执行的脚本相同) 我读到require“my_script”和require./my_script”实际上会加载两次脚本(ruby不会识别它实际上是同一个脚本),这就是为什么建议使用File.expand_path的原因:如果每次需要脚本时都使用它,那么它只会加载一次 我觉得奇怪的是,像Ruby这样的简洁语言似乎没有更短的解决方案。例如,python的简单功能是: import .some_other_module_in_the_same_dir

是否有一种更短的方法要求文件位于同一目录中(与正在执行的脚本相同)

我读到
require“my_script”
require./my_script”
实际上会加载两次脚本(ruby不会识别它实际上是同一个脚本),这就是为什么建议使用
File.expand_path
的原因:如果每次需要脚本时都使用它,那么它只会加载一次

我觉得奇怪的是,像Ruby这样的简洁语言似乎没有更短的解决方案。例如,python的简单功能是:

import .some_other_module_in_the_same_directory

我想我可以满足猴子补丁
的要求
。。。但那是邪恶的!;-)

即使在从其他目录运行脚本时,上述操作也会起作用。 然而,在同一个目录中,您引用的较短表单按预期工作,至少在ruby 1.9中不会产生双重要求

testa.rb testb.rb 运行“ruby testa.rb”将导致:

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

但是,即使从另一个目录(例如ruby somedir/script.rb)也可以使用较长的表单。

将其放在标准库目录中(已经在默认加载路径中的某个地方
$:
):

caller
允许您访问当前调用堆栈,并告诉您什么文件和位置,因此
push loadpath.rb
使用该文件将
加载的文件添加到加载路径

请注意,您应该
load
文件,而不是
require
文件,因此可以多次调用主体(每次更改加载路径时调用一次)

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

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

只需要
文件名

是的,如果您将其指定为
filename
/filename
,它将导入两次,所以不要这样做。您没有指定
.rb
,因此不要指定路径。我通常将我的大部分应用程序逻辑放入
lib
中的一个文件中,然后在
bin
中有一个类似以下内容的脚本:

#!/usr/bin/env ruby

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

$:自从ruby 1.9以来,您可以使用
require\u relative


检查
require\u relative
或核心API。

哦,天哪,但愿我早点看到你的答案。
start test A
start test B
finish test B
finish test A
# 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'
#...
# push-loadpath.rb
def push_loadpath
  $: << File.expand_path(File.dirname(caller.first))
end
% ls /path/to/
bin.rb lib1.rb lib2.rb #...
% cat /path/to/bin.rb
require 'push-loadpath'
push_loadpath
require 'lib1'
require 'lib2'
#...
#!/usr/bin/env ruby

$: << File.join(File.dirname(__FILE__), "/../lib")
require 'app.rb'
App.new.run(ARGV)