2017-11-22 10 views
0

Ruby forループでローカル変数を設定できるかどうかを知りたいと思います。forループのRubyローカル変数

より正確には、私はこのように動作するようにforループを持っているしたいと思います:

tmp = 0 
1.upto(5) { |i;tmp| puts i; tmp = i; } ; "tmp: #{tmp}" 

tmp変数はfoorループ内で実行されますどのような変更しないでください。

+0

ご迷惑をおかけして申し訳ありません。 –

+0

あなたは何を達成しようとしていますか?外側からの変数がループ内で変更されないようにするには、変更しないでください。あなたがそれを変更したくない場合は、ループ内の割り当てのポイントは何ですか? –

+0

共通のパターンを保つために、私は他のプログラミング言語と同じように 'for'ループを使いたいと思います。ループのローカル変数を決定することができるのは実質的なメリットですが、なぜそうなのか議論する必要はないと思います。 –

答えて

0

私はそれが可能だとは思わない、forループは独自の範囲を持っていません。

1

あなたが外変数

tmp = 0 
for i in (1..5) do 
    proc do |;tmp| 
    puts i 
    tmp = i 
    end[] 
end 

これはひどいですがマスキングするための新しいブロックを導入することができます。 foreachの違いは、forループの反復変数が外側スコープを汚染することです。

x = [] 
# i has same scope as x 
for i in (1..3) 
    # closure captures i outside the loop scope, so... 
    x << lambda { i } 
end 
# WAT 
x.map(&:call) # [3, 3, 3] 

x = [] 
(1..3).each { |i| x << lambda { i } } 
# sanity restored 
x.map(&:call) # [1, 2, 3] 

はよりeachのようなあなたのfor行為をするために上記の私のハックを使用すると、すでに混乱行動がさらに混乱になります。 forを完全に避ける方がよいでしょう。

+0

@Maxありがとう、 'proc'のあなたの例は私の質問に答えます。私はそれが素晴らしい構造ではないことに同意します。反対に、 'for'はコンピュータプログラミングの中で最もよく書かれた言葉であり(それは'あれ ')、それをRubyのビジネスから切り離すことは残念です。 –

+0

@NicolaMingotti私はRubyを使っている間、このような実験の外に一つの 'for'ループを書いていません。私はそれがそこにしかないと確信しているので、人々は他の言語から来るときに驚くことはありません。 – Max

関連する問題