hogeを出力すると4と表示されるのですが、個人的には0が表示されると思いました。
初期値0
で、4回+1
してるので、4
です。
理由としてはブロック引数に渡されているiがブロックの中にないため、eachが回らないと考えたからです。
ブロック引数を使おうが使うまいが、そもそもブロック引数宣言を省略しようが、ループが回るかどうかには関係ないです。
そこでブロックの中身をi += 1に書き換えた結果、出力結果が0になりました。
x
に対しての代入が最初のx=0
しかないのだったら、ずっと0
のままなのは当然です。
なぜブロック引数と、そのブロックに入っている変数が違うのに、eachが動作しているのでしょうか。
よろしくお願いします。
ブロックの中では、ブロック引数以外の変数がたくさん出てきますよ。見たこと無いでしょうか?
わざとらしい例ですが、
Ruby
1sum = 0
2(1..10).each do |i|
3 i2 = i*2
4 sum += i2
5end
6p sum #=> 110 ブロックの外で定義された変数は中でも有効。
7p i #=> これはエラー。iはブロック内のみの変数なので、抜けたら未定義。
8p i2 #=> これもエラー。理由は同上。
さらにわざとらしいですが、ブロック引数をやめてこう書いてもいいです。
Ruby
1sum = 0
2i = 0
3(1..10).each do #ブロック引数無し
4 i += 1
5 i2 = i*2
6 sum += i2
7end
8p sum #=> 110
9p i #=> 10 ブロックの外で定義された変数なので。
10p i2 #=> これはエラー。理由は前出。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/09 23:36