2017-11-12 9 views
0

オブジェクトの配列を調べ、そのオブジェクトを人物名で見つけ出し、クラスメソッドを使用してそのオブジェクトの年齢値を編集する方法を理解しようとしています。以下の例では、私が設定した.set_ageメソッドを使用して年齢を設定しようとしています。しかし、どのオブジェクトにも変更が返ってくるわけではありません。オブジェクトに正しくアクセスしていないためですが、その方法を理解することはできません。誰でもアレイのオブジェクトにアクセスし、その人の名前で人を見つけて年齢を設定するのを手助けできますか?Ruby - 複数のオブジェクトを持つ配列で年齢を設定する

class Person 
    attr_accessor :name, :age, :mood 
    def initialize(name, age, mood) 
    @name = name 
    @age = age 
    @mood = mood 
    end 
    def set_age(amount) 
    @age = amount 
    self 
    end 
end 
person1 = Person.new("John", 18, "happy") 
person2 = Person.new("Jackie", 20, "happy") 
person3 = Person.new("Charlie", 19, "sad") 

persons_array = [] 
persons_array << person1 
persons_array << person2 
persons_array << person3 

while true 
    p "1. Change persons age" 
    p "2. Exit" 
    choice = gets.chomp 
    case choice 
    when "1" 
     p "Name of person to change." 
     person_name = gets.chomp 
     p "What would you like to set their age to?" 
     person_age = gets.chomp.to_i 
     persons_array.each_with_index {|key, value| 
     if key == person_name 
      person_name.set_age(person_age) 
      p "changed #{person_name} age" 
      p persons_array 
     end 
     } 
     p persons_array 
    when "2" 
     break 
    end 
    end 
+0

私はあなたがそれはJavascriptで言うと無用「を実行し、コードスニペット」ボタンになり、あなたの質問では、これらのHTMLコメントを取り払うべきだと思います。 –

+0

なぜあなたの 'age ='メソッドとほとんど同じ 'set_age'メソッドがありますか?なぜ 'age ='メソッドを使うのではないのですか? –

+0

Jorgの書き換えについてどう思いますか? – brff19

答えて

0

あなたは、配列のインデックスに対してperson_nameと一致しようとしているようです。 を実行すると、Rubyに配列全体を繰り返し処理させ、各要素のインデックスをブロックで利用できるようにするように指示します。

しかし、配列は整数でインデックスされるため、基本的にはstdinの人の名前を整数と比較しています。オブジェクトの実際の名前を比較する方が良いでしょう。

何かのように:あなたはJavascriptを投稿していないので

found_person = persons_array.find { |person| person.name == person_name } 
if found_person 
    found_person.set_age(person_age) 
    p "changed #{person_name} name" 
end 
+0

あなたは素晴らしいです。これは私が必要としたものです。私は少し頭の中にいましたが、あなたのおかげで今私は見ることができます! – brff19

関連する問題