質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby

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

Q&A

解決済

1回答

117閲覧

ruby 基礎 each for

taisy

総合スコア21

Ruby

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

1グッド

1クリップ

投稿2018/08/26 13:55

お世話になっております。
本日、eachとforの書き方について練習していたところ、プログラムの返答に理解できない点がありまして、その理由を教えていただけませんか?
for i in 15..20 do
puts "#{i}hello"
end

for i in ["desk" , "chair"]
p i
end

for name, id in {taniguchi:177322 , murata:177332}
p "#{name}, #{id}"
end

(15..20).each do |i|
p i
end

["red" , "blue"].each do |i|
p i
end

{taguchi:322 , murata:177332}.each do "|i| #{name}, #{id}"
p i
end
というプログラムを書いていたのですが、最後の
{taguchi:322 , murata:177332}.each do "|i| #{name}, #{id}"
p i
end
の返答が
"chair"
"chair"
となりました。
理想としては、
"taguchi, 322"
"murata, 177332"
となる予定でした。
ちなみに、その予定通りに行くプログラムはかけるようになっています。
しかし、途中で出たこの結果が納得できなかったので、その理由を教えていただきたいです。

DrqYuto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

each等のブロックパラメーター(|で囲んだ変数)の有効範囲は、ブロック限りですが、forの変数はブロック終了後も有効です。
つまり、

Ruby

1for i in ["desk" , "chair"] 2p i 3end

の実行が終了した時点のiの値は"chair"でそれがずっと有効のままです。
その後の、

Ruby

1(15..20).each do |i| 2p i 3end

でもiが登場していますが、このiはブロックパラメーターで、外側のiとは無関係です。

Ruby

1{taguchi:322 , murata:177332}.each do "|i| #{name}, #{id}" 2p i 3end

では、iはブロックパラメーターとして宣言されているわけじゃないので、p iでは外側のiつまり"chair"が参照されます。

"|i| #{name}, #{id}"は、単なる文字列です。nameidは、その前のfor name,idで代入された値が残っていて、全体としては"|i| murata, 177332"になります。

投稿2018/08/26 14:19

otn

総合スコア84498

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

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

taisy

2018/08/26 23:36

回答ありがとうございます。 前に書いたプログラミングの値がそのまま保持されていて、そのあとにしっかりとした定義ができていなかったので、そのまま違う値が代入されたんですね。 forとeachの違いも理解することが出来ました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問