Ruby:在一组脚本中共享公共变量和方法

时间:2009-07-27 21:21:21

标签: ruby

我有一个充满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库和框架,但我目前的环境中没有任何可用的。我只是直接红宝石,我对一些在这里运作良好的基本习语有点生疏,或者看起来对红宝石专家来说是正确的。

任何帮助表示赞赏!

3 个答案:

答案 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

另请参阅Modulesthe Programming Ruby page on modules

答案 1 :(得分:1)

  1. 使用大写字母表示常量(HOME_DIR_PATH,而不是home_dir_path)
  2. 将您的方法放在模块中。
  3. 您可以通过模块调用您的方法,或者您可以将模块包含在命名空间中并直接调用它们(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会产生警告,因为它不被视为良好做法。