我有一个充满ruby脚本的目录用于常见任务,我已经开始积累一组常见变量和方法,我发现自己在每个新脚本中定义。改进这一步骤的下一步似乎是创建一个文件(例如,commonstuff.rb)并从其他脚本中“需要”该文件,以便公共变量和方法在所有地方都可用并且只定义一次。
一个不起作用的简单尝试:
commonstuff.rb
username=ENV['USER']
home_dir_path=ENV['HOME']
def print_and_execute(command, &block)
puts command
process_io = IO.popen(command + "2>&1")
while(line=process_io.gets)
if (block != nil)
yield line
else
puts line
STDOUT.flush
end
end
end
script1.rb
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/common_stuff'
puts home_dir_path # Fail
print_and_execute "date" # Fail
我使用过ruby库和框架,但我目前的环境中没有任何可用的。我只是直接红宝石,我对一些在这里运作良好的基本习语有点生疏,或者看起来对红宝石专家来说是正确的。
任何帮助表示赞赏!
答案 0 :(得分:8)
将您的方法和变量包装在module中,例如
module CommonStuff
USERNAME=ENV['USER']
HOME_DIR_PATH=ENV['HOME']
def print_and_execute(command, &block)
...
end
end
然后script1.rb可能就像:
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/commonstuff.rb'
include CommonStuff
puts HOME_DIR_PATH # Win
print_and_execute "date" # Win
或者,如果您不想在命名空间中包含该模块:
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/commonstuff.rb'
puts CommonStuff::HOME_DIR_PATH # Win
CommonStuff.print_and_execute "date" # Win
答案 1 :(得分:1)
您可以通过模块调用您的方法,或者您可以将模块包含在命名空间中并直接调用它们(Sarah有所有这些代码)
答案 2 :(得分:0)
这是一个更简单的解决方案。不需要模块。我注意到你的文件名可能不匹配:你说你命名了你的公共文件' commonstuff.rb',但你需要用下划线作为' common_stuff':
require File.dirname(__FILE__) + '/common_stuff'
通过以下方式解决此问题:
require_relative 'commonstuff' # require_relative if ruby >= 1.9
您的方法现在应该可以工作,我们只需要让您的变量可访问。当您需要文件时,方法,全局变量和常量都会导入到命名空间中,因此只需将变量更改为CONSTANTS(如另一个用户建议的那样):
USERNAME = ENV['USER']
HOME_DIR_PATH = ENV['HOME']
或使它们成为$ globals:
$username = ENV['USER']
$home_dir_path = ENV['HOME']
如果要在运行时重新定义变量,可能需要在CONSTANTS上使用$ global变量。您可以重新定义常量,但ruby会产生警告,因为它不被视为良好做法。