「プロを目指す人のためのRuby入門(第2版)」のP247~248にあるプログラムに関する質問です。
自分なりに実行順序に番号を付けてみました。
①から⑤までは一直線に進むのですが、⑥のところで、initialaizeメソッドに進む部分とクラスメソッド戻り値をusesrsに入れる部分とに分かれるように見えて混乱しています。
⑥のところでは、create_user(names)の戻り値として、 ['Alice', 'Bob', 'Carol']が戻ると理解しています。
そのため、この戻り値は、③の処理が全部終わってから戻るように思えます。
一方、⑤のUser.new(name)は逐次的に実行されて、⑥のinitializeを実行し、⑦で、@nameを作成しているように思えます。
この順番だと、最後の⑨と⑩が実行されるときには、@nameは'Alice' → 'Bob'  → ´Carol' と上書きを重ねて、
’Carol'しか残っていないように思えます。
どうして、users = create_user(names) でまとめて渡された配列のその後の処理と、 逐次的に実行されたUser.new(name)で作成された
@names の結果が、⑩のところで、ぴったりと合うかがわかりません。
この考え方のどこが間違っているのか、どう理解すればいいのか教えて頂ければ有難くぞんじます。
Ruby
1class User 2 def initialize(name) ←⑥ (⑤のuser.newのときに呼ばれる) 3 @name = name ←⑦ 4 end 5クラス名.メソッド名 6# self.を付けるとクラスメソッドになる 7 def self.create_users(names) ←③ 8 names.map do ¦name¦ ←④ 9 User.new(name) ←⑤ 10 end 11end 12# これはインスタンスメソッド 13 def hello ← ⑨ 14 "Hello, I am #{@name}." ⑩ 15 end 16end 17names = ['Alice', 'Bob', 'Carol'] ←① 18# クラスメソッドの呼び出し 19users = User.create_users(names) ←② ←⑥配列オブジェクトをusersに入れる。 20users.each do ¦user¦ ←⑦ 21# インスタンスメソッドの呼び出し 22 puts user.hello ←⑧ 23end 24#=> Hello, I am Alice. 25# Hello, I am Bob. 26# Hello, I am Carol.
質問を出した後に再度考えてみたのですが、 ⑥で受け取った配列オブジェクトは各々のオブジェクトの中に、initializeメソッドで作成された@nameを含んでいるため、@nameが上書きされることはないと理解できるようになりました。⑩のhelloメソッドにある@nameもinitializeメソッドから直接@nameを引っ張ってきているわけではなく、配列オブジェクトの中に含まれている@nameを利用していると理解しました。このような理解で正しいでしょうか。

回答2件
あなたの回答
tips
プレビュー


