人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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



●質問者: tyn
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Class Ruby String to_i
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● kn1967
●35ポイント

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

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

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


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

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

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


2 ● nuna
●35ポイント ベストアンサー

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


3 ● uehaj
●10ポイント

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.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ