2009-07-27 61 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會產生一個警告,因爲它不被認爲是好的做法。