初心者Rubyの質問。このコードを変更する最も簡単な方法は何ですか?ブロックを完全にそのまま残して、副作用を解消する?ruby proc/lambdaで本当にローカル変数を使う方法
$ irb
irb(main):001:0> x = lambda {|v| x=2
irb(main):002:1> v}
=> #<Proc:[email protected](irb):1>
irb(main):003:0> x.call(3)
=> 3
irb(main):004:0> x
=> 2
これは私の問題を説明するための工夫ができ、最も簡単な例であるので、「割り当てを削除」または「XへのPROCを割り当てないと、」私が探しているものではありません。
元の囲みスコープに影響を与えずに割り当てることができるProc(またはラムダ)にローカル変数を設定したいとします。ブロックをラップするクラスやモジュールを動的に作成することはできますが、それはそのような基本的なことのために残酷に思えます。
私がやろうとしているものに同等のPython:
def x(v):
x = 2 # this is a local variable, what a concept
return v
外部変数と同じ名前を使用してみませんでしたか? –
'x'は外部スコープで宣言されている場合はクロージャ変数です。 '_x'のように、これらの変数の名前を変更できないような条件がありますか?あなたはRuby言語の基本的な期待を無効にしようとしています。 – tadman
明らかに、メソッド内にローカル変数を持つことは可能です。 VMに新しいレキシカルスコープを作成する唯一の言語構造ですか?もしそうなら、 'Proc'と' lambda'は適切な関数型プログラミングを行うのに使うことができないという点で安いようです。 – wberry