a = "10"
a = a.to_i
puts a.class ⇒ Fixnum
a = ["1","2","3"]
a.each do |i|
i = i.to_i
end
puts a[0].class ⇒ String
a[0].classはFixnumになると思ったのですが、なぜStringのままなのでしょうか?
i = i.to_i の i は do ... end の中だけで有効なブロックローカル変数です。
i に何かを代入しても、a に影響を与えることはありません。
詳しく言えば、each によるループで、i は順番に "1" "2" "3" という String オブジェクトを指し示すのであって、a[0] a[1] a[2] などといった変数 a の要素を指し示すのではありません。
a の要素を置き換える場合には Array#map! を使います。
a = ["1","2","3"]
a.map! do |i|
i.to_i
end
puts a[0] #=> 1
puts a[0].class #=> Fixnum
あるいは、String 自体を変化させる操作をすることはできます。
a = ["1","2","3"]
a.each do |i|
i << "0"
end
puts a[0] #=> "10"
puts a[0].class #=> String
ループ1回目 i の中身は "1"
ループ2回目 i の中身は "2"
ループ3回目 i の中身は "3" ここでループは終わる
i にはループ毎に a からデータがコピーされていて、
コピーされたものを対象に何をしても、
大元の a には影響が出ないという訳です。
i = i.to_i の i は do ... end の中だけで有効なブロックローカル変数です。
i に何かを代入しても、a に影響を与えることはありません。
詳しく言えば、each によるループで、i は順番に "1" "2" "3" という String オブジェクトを指し示すのであって、a[0] a[1] a[2] などといった変数 a の要素を指し示すのではありません。
a の要素を置き換える場合には Array#map! を使います。
a = ["1","2","3"]
a.map! do |i|
i.to_i
end
puts a[0] #=> 1
puts a[0].class #=> Fixnum
あるいは、String 自体を変化させる操作をすることはできます。
a = ["1","2","3"]
a.each do |i|
i << "0"
end
puts a[0] #=> "10"
puts a[0].class #=> String
a = ["1", "2", "3"]
i = a[0]
i = i.to_i
i = a[1]
i = i.to_i
i = a[2]
i = i.to_i
puts a[0].class ⇒ String
こういうことだからです。(「コピー」ということ)
コメント(0件)