2009-07-27 67 views
2

我有一个完整的用于常见任务的ruby脚本目录,并且我已经开始累积一组通用变量和方法,我发现自己在每个新脚本中定义。改善这一点的下一步似乎是创建一个文件(比如commonstuff.rb),并从其他脚本中“需要”该文件,以便公共变量和方法在所有地方都可用并且只定义一次。Ruby:在一组脚本中共享公共变量和方法

一个简单的尝试,没有工作:

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库和框架,但我不”在我目前的环境中没有任何可用的。我只是笔直的红宝石,对于一些基本的习惯用法,我可能会有点生疏,或者这对于红宝石专家来说看起来是正确的。

任何帮助表示赞赏!

回答

7

裹在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. 你常数(HOME_DIR_PATH,不home_dir_path)使用大写字母
  2. 把你方法模块内。

您可以通过模块调用你的方法,或者您可以在您的命名空间中的模块,并直接打电话给他们(萨拉代码这一切)

+0

谢谢! 为了其他人的利益,它看起来像常量(是的,我应该说在问题中的“常量”,而不是“变量”)可以留在模块定义之外。 此外,在将模块放入模块之后,我必须使用附加的“include”语句将该模块包含在使用其功能的脚本中。 – Charlie 2009-07-27 21:38:36

+0

是的,我不会在模块中放置这样的常量,因为它们不会在您的用例中导致冲突。 – 2009-07-27 21:45:47

0

有一个更简单的解决方案。模块不是必需的。我注意到你可能有文件名不匹配:你说你叫您共同文件“commonstuff.rb”,但是你用下划线为“common_stuff”需要它:

require File.dirname(__FILE__) + '/common_stuff' 

解决影响:

require_relative 'commonstuff' # require_relative if ruby >= 1.9 

您的方法现在应该可以工作,我们只需要让您的变量可访问。方法,全局变量和常量都导入到您的命名空间,当你需要一个文件,所以只需改变你的变量,常量(作为另一个用户建议):

USERNAME = ENV['USER'] 
HOME_DIR_PATH = ENV['HOME'] 

或使它们$全局:

$username = ENV['USER'] 
$home_dir_path = ENV['HOME'] 

如果您在运行时重新定义变量,您可能希望在CONSTANTS上使用$全局变量。你可以重新定义常量,但是ruby会产生一个警告,因为它不被认为是好的做法。