有没有更短的方法来在ruby中的同一目录中要求一个文件?

Min*_*ark 56 ruby path require

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

require File.expand_path(File.dirname(__FILE__) + '/some_other_script')
Run Code Online (Sandbox Code Playgroud)

我读了这个require "my_script"并且require "./my_script"实际上会加载脚本两次(ruby不会认识到它实际上是同一个脚本),这File.expand_path就是推荐的原因:如果每次需要脚本时都使用它,那么它只会被加载一旦.

对我来说,像Ruby这样的简洁语言似乎没有更短的解决方案,这似乎很奇怪.例如,python只是这个:

import .some_other_module_in_the_same_directory
Run Code Online (Sandbox Code Playgroud)

我想我可以修补猴子require......但这只是邪恶的!;-)

knu*_*nut 93

由于ruby 1.9你可以使用require_relative.


dvo*_*rak 12

只需要filename.

是的,如果你指定它,因为它会导入两次filename./filename,所以不这样做.您没有指定.rb,所以不要指定路径.我通常把我的应用程序逻辑的大部分放入一个文件中lib,然后有一个脚本bin,看起来像这样:

#!/usr/bin/env ruby

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

另一个优点是,如果加载应用程序逻辑没有自动开始执行它,我发现更容易进行单元测试.


小智 3

即使您从其他目录运行脚本,上述内容也将起作用。但是,在同一目录中,您引用的较短形式可以按预期工作,并且至少对于 ruby​​ 1.9 不会导致双重要求。

测试数据库

puts "start test A"
require 'testb'
require './testb'
puts "finish test A"
Run Code Online (Sandbox Code Playgroud)

测试b.rb

puts "start test B"
puts "finish test B"
Run Code Online (Sandbox Code Playgroud)

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

start test A
start test B
finish test B
finish test A
Run Code Online (Sandbox Code Playgroud)

但是,较长的形式甚至可以在另一个目录中使用(例如 ruby​​ somedir/script.rb)