2012-01-18 5 views
3

説明が少し難しい理由から、私は次のことをする必要があります:a = 1のようにいくつかのグローバルを設定するmaster.rbファイルがあります。マスターファイルに設定されたグローバルで実行される別のファイルother_file.rbを呼び出したいとします。 Pythonではrunpy.run_module('other_module', globals())を使います。グローバルで完全な別のルビスクリプトを実行していますか?

誰でもRubyで同等のことを考えることができますか?私はrequireinclude、およびloadを見ましたが、必要なものはまったくないようです。具体的には、グローバルをother_file.rbにプルしません。私は、新しいプロセスをフォークしようとしているわけではなく、グローバルの状態を維持しながら、 "other_module"に実行を渡すだけです。

+0

これはグローバルではありません。 '$ a = 1'はグローバルを設定しています。外側のスコープにローカル変数を設定するだけです。 – Phrogz

答えて

4

a=1はグローバル変数ではなく、ファイルにスコープされるローカル変数です。この振る舞いが本当に無ければ、$a=1を使ってグローバル変数を設定してください。

+0

ありがとう、それは私が行方不明だった重要な部分でした! – zsimpson

4

が絶対にである必要がある場合は、グローバルを使用することができ、接頭辞は$と宣言されています。グローバルネームスペースが1つしかないので、衝突を可能にするため、これらは非常に推奨されません。一般的には、$LOAD_PATHのような通訳の設定に使用されます。

より良いアプローチは、インスタンス変数を持つモジュールを使用することです:

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

MyContainer.settings[:foo] = :bar 

これはそれらにアクセスすることから他のサブプログラムを防止しないが、名前空間に含まれているあなたの変数を維持するという利点があります。

これは、forkを使用して作成された同じRubyプロセスまたは子のコンテキスト内でのみ機能するため、systemまたはexecを使用すると機能しません。フォークされたプロセスは、IPCを使用して親と通信する必要があることにも注意してください。

+0

私はそれがきれいな方法であることに同意します。非常に奇妙な状況の中で私はそれが動作しませんだ。説明ありがとう! – zsimpson