2017-03-15 18 views
-2

bindingevalを使用して、メソッドの外部から変数の値を変更する方法がわかりません。 例方法:Ruby:メソッド外の変数を変更する

def foo 
    a = 1 
    binding 
end 

私は、2つの方法で変数aを得ることができます。しかし、私はそれを行うことができます

foo.local_variable_get(:a) #=> 1 
# or 
foo.eval("a") #=> 1 

しかし、私は新しい値

foo.local_variable_set(:a, 2) 
foo.local_variable_get(:a) #=> still 1 
foo.eval("a = 2") 
foo.local_variable_get(:a) #=> still 1 

を設定することはできませんバインディングの場合オブジェクトはどのメソッドの外にもグローバルスコープで作成されました。

bar = 123 
binding # Binding object with global scope 
binding.eval("bar") #=> 123 
binding.eval("bar = 456") 
binding.eval("bar") #=> 456 

メソッド外のメソッドローカル変数に新しい値を設定するにはどうすればよいですか?ありがとうございました。

+1

最初の質問を呼び出す場合

それが動作するはずですなぜあなたはそれの外からメソッド内のローカル変数を変更したいのですか?ローカル変数、インスタンス変数、クラス変数、グローバル変数の違いを理解していない可能性がありますか?これは "[XY問題](https://meta.stackexchange.com/q/66377/153968)"のように聞こえますが、あなたは1つのことについて尋ねていますが、実際には別のことを尋ねるべきです。なぜあなたはあなたのプログラムの範囲でこれを行うことができるようにしたいのかという目標を説明してください。 –

+0

これは意味をなさない。ローカル変数は、メソッドの内部で永続性を必要としない値を保持するために使用されます。メソッドが終了するとすぐに破棄されます。その変化を方法の中で起こすようにあなたはどこで提案しますか?ローカル?いくつかのランダムなまたは任意のスポットの中流?このような機能をどのように使用するかを示すコードスニペットをお勧めします。 –

+0

@theTinMan、私はこれについて[ここ](https://ruby-doc.org/core-2.2.0/Binding.html#local_variable_set-method)を読んでいて、irbで同様の例を試しました。私はそれを理解したい。 – tbard

答えて

0

例では、常にfooを呼び出して新しいバインディング(コンテキスト)を作成します。それが変更が失われている理由です。あなたは同じ結合

b = foo 
b.local_variable_get(:a) # => 1 

eval("a = 2", b) 
b.local_variable_get(:a) # => 2 

b.local_variable_set(:a, 3) 
b.local_variable_get(:a) # => 3 
関連する問題