Rubyのeachについて


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のままなのでしょうか?

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2009/11/04 10:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:nuna No.2

回答回数32ベストアンサー獲得回数11

ポイント35pt

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

その他の回答2件)

id:kn1967 No.1

回答回数2915ベストアンサー獲得回数301

ポイント35pt

ループ1回目 i の中身は "1"

ループ2回目 i の中身は "2"

ループ3回目 i の中身は "3" ここでループは終わる


i にはループ毎に a からデータがコピーされていて、

コピーされたものを対象に何をしても、

大元の a には影響が出ないという訳です。

id:nuna No.2

回答回数32ベストアンサー獲得回数11ここでベストアンサー

ポイント35pt

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

id:uehaj No.3

回答回数158ベストアンサー獲得回数15

ポイント10pt

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

こういうことだからです。(「コピー」ということ)

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません