🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

436閲覧

rubyのeachメソッドについて

rm11_j

総合スコア4

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2021/03/08 11:19

初歩的な質問かもしれませんが不明点がありましたので質問させていただきます。

a = [1,2,3,4] a.each do |n| puts n if n == 2 puts "2は消すよ" a.delete(2) end end

このようなコードをターミナルで実行しました。
すると以下のように出力されました。

1 2 4 =>[1,3,4]

eachメソッドで配列の要素に取り出し、nが2の時はdeleteされるので戻り値はこの通りだと思いますが
nが3の時にputs nが実行されていない理由がわかりません。
どなたかわかる方回答よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Rubyのメソッドの動作を厳密に記述した物は、ソースプログラムくらしかないと思いますが、
JIS規格書には、Array#eachは、

レシーバのそれぞれの要素について,添字順に,その要素を唯一の実引数としてblockを呼び出す。

と書いてあります。
添え字を使って要素を順番に処理していると解釈すると、添え字1で要素2を処理した次は、添え字2になりますが、その時点での添え字2の要素は4なので、4が処理されるのでしょう。

JIS規格は過去のRubyベースであり、今後この処理が変わる可能性はありますので、上記動作に依存したコードは書かない方が良いです。

a自体とeachで回すものを別物にしたいのなら、a.dup.eachにすればいいかと思います。

投稿2021/03/08 12:48

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

nが3の時にputs nが実行されていない理由がわかりません。

aの要素を途中で消したので、不自然な挙動となっています。

このような、「配列を回しながら消す」ようなことをやった場合、るりまにもその旨の解説がない以上、動作は環境によって変わるかもしれないと考えておくのが安全です(こんな操作はしないようにしましょう)。

投稿2021/03/08 12:23

maisumakun

総合スコア145977

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問