在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)