2012-01-18 44 views
3

由於有些難以解釋的原因,我需要執行以下操作:我有一個master.rb文件,它設置了一些類似於:a = 1的全局文件。我想調用另一個文件other_file.rb,它將與主文件中設置的全局文件一起運行。在Python中,我會使用runpy.run_module('other_module', globals())用globals完整運行另一個ruby腳本?

任何人都可以想到在Ruby中的等價物?我看過require,includeload,但沒有一個看起來完全符合我的需要,特別是他們沒有將全局變量引入other_file.rb。請注意,我並非試圖分叉一個新進程,只需將執行過程移交給「other_module」,同時保持全局狀態。

+0

這不是全球性的。 '$ a = 1'正在設置全球。你只是在外部範圍內設置一個局部變量。 – Phrogz 2012-01-18 23:53:17

回答

4

a=1不是一個全局變量,它是一個局部變量,它的作用域是該文件。如果您確實需要這種行爲,請使用$a=1來設置全局變量。

+0

謝謝你,那是我失蹤的關鍵部分! – zsimpson 2012-01-19 00:15:11

4

如果你絕對必須,你可以使用全局變量,它們的前綴爲$。他們非常沮喪,因爲只有一個全局命名空間,這使得碰撞成爲可能。通常它們用於解釋器配置,如$LOAD_PATH

更好的方法是使用具有實例變量模塊:

module MyContainer 
    def self.settings 
    @settings ||= { } 
    end 
end 

MyContainer.settings[:foo] = :bar 

這有保存包含在一個命名空間,而不會阻止其他子程序訪問它們的變量的優勢。

請記住,這隻能在使用fork創建的相同Ruby進程或子進程的上下文中使用,因此使用systemexec將不起作用。還請記住,分叉進程需要使用IPC與其父進行通信。

+0

我同意這是一個乾淨的方式。在我所處的非常奇怪的情況下,它不會工作。感謝您的解釋! – zsimpson 2012-01-22 21:18:26