4

私は、実際のコードソリューションよりも、この理論に主に興味があります。1 つのメイン Ruby スクリプトで他のスクリプトを呼び出し、変数を相互に共有するにはどうすればよいですか? 私は少し混乱しています..環境変数、セッション変数、メソッド、モデル、コントローラーを使用する必要がありますか?それを行うための最良の方法は何ですか!!?

4

3 に答える 3

5

script.rbこれを含むがあると仮定しましょう:

$var = :value
def get; A end
load 'another_script.rb'
get  # Will it succeed?

を実行すると、すべての行ruby script.rbの内容を読み取って実行する Ruby プロセスが生成されます。script.rbRuby インタープリターには、オブジェクト データ、それらを参照する変数、それらが属するスコープ、現在使用しているメソッドなどの情報を保持する実行状態があります。

インタープリターが$var = :value行を読み取ると、それ自体の状態が変更されます。新しく作成されたシンボル オブジェクトを参照するグローバル変数を格納します。A次に、定数によって参照される値を返すメソッドを定義します。この時点で呼び出すとNameError、定数が存在しないため、 が発生します。行に到達すると、2 番目のプロセスが開始されないことを除いて、 load 'another_script.rb'running に似ています。スクリプトの内容は、同じ実行コンテキスト内でruby another_script.rb読み取られ、解釈されます。

以下another_script.rbが含まれているとします。

$var = :changed
class A; end

以前はシンボルを参照していた$var変数が、シンボルを参照するようになります。次に、オブジェクトが作成され、新しい定数に割り当てられます。:value:changedClassA

このスクリプトをロードすると、への呼び出しgetが成功します。もう 1 つの意味は、順序が重要であるということです。例えば:

load 'another_script.rb'
$var = :value

実行が終了するとすぐにオーバーライドされるため、設定されたものはすべて失われますanother_script.rb$var

スクリプトがいくつあっても、loadそれらが同じプロセスで実行されている限り、それらは常に同じデータを共有します。ファイル間で共有されないのは、ローカル変数のみです2 つの異なるRuby インタープリター間でデータを共有したい場合、事態は複雑になります。requireeval

ruby script.rb &
ruby another_script.rb &

その場合、プロセス間通信を使用する必要があります。

于 2012-05-03T12:08:33.447 に答える
3

呼び出しの意味によって異なります。

一般に、「スクリプトが別のスクリプトを呼び出す」ときは、基本的に「別のプロセスを開始するプロセス」と同じです。そこで、Ruby に固有のものではなく、プロセス間通信を使用します。はい、環境変数のような単純なものは情報を渡す 1 つの方法ですが、ファイル、ソケットなどを考慮する場合があります。

OTOH、ある「スクリプト」(.rb)ファイルのRubyコードを別のファイルで使用する場合は、最初の回答が指摘したようにロード/要求します。これにより、ロード元のファイルでメソッド (def f)、定数 (CTE)、インスタンス変数 (@f)、およびグローバル変数 ($G) が使用可能になります。ローカル変数ではありません (x=3 など)。

特別な場合には、「eval」を使用してローカル変数にアクセスすることもできますが、それはあなたのシナリオには当てはまらないと思います。

于 2012-05-03T11:50:33.250 に答える
3

2 つの Ruby プロセスが (異なるマシンで実行されている場合でも) 通信する必要がある場合は、Drubyが組み込みの方法です。

于 2012-05-03T12:58:10.193 に答える