2017-10-11 2 views
1

#buy_fishを使用してインスタンスの#petsハッシュに追加する際に問題があります。これは、ハッシュに追加されているものを正常に返しますが、ハッシュは変更されません。インスタンスのハッシュ(ルビー)に追加できません

所有者クラス

class Owner 
    attr_accessor :name 

    def initialize(name) 
    pets 
    end 

    def pets 
    @pets = {cats: [], dogs: [], fishes: []} 
    end 

    def buy_fish(name) 
    self.pets[:fishes] << Fish.new(name) 
    end 
end 

ステファンが指摘したように、petsへの各呼び出しは@petsに新しいハッシュをasssigns

class Fish 
    attr_reader :name 

    def initialize(name) 
    @name = name 
    end 
end 
+3

「pets」を呼び出すたびに、 '@pets'に新しいハッシュが割り当てられます。代入を 'initialize'に移すか' @pets || = {...} 'を使います。 – Stefan

+3

また、 'self.pets [:fishes] .push(Fish.new(name))'をしたいと思います。それ以外の場合は、毎回、単一の 'Fish'インスタンスにキーを設定するだけです。 – John

+0

ステファンありがとうございます。それはうまくいった。私は学んでいなかった|| =まだ。これを行う別の方法がありますか?私は悪いコードを書いたので、これがチートアウトになったような気がしますか? また、Johnさん、コードを修正するときに気がつきました。とにかくありがとう! –

答えて

1

petsの評価が怠け者になる理由はありません。したがって、コンストラクタ内でインライン化するだけで、リーダーを追加することができます。

class Owner 
    attr_accessor :name 
    attr_reader :pets 

    def initialize(name) 
    @pets = {cats: [], dogs: [], fishes: []} 
    end 

    def buy_fish(name) 
    @pets[:fishes] << Fish.new(name) 
    end 
end 
1

魚のクラス。 petsメソッドに||=を追加するとこれが修正されました。マットのソリューションの作品@

コード

def pets 
    @pets ||= {cats: [], dogs: [], fishes: []} 
end 
+2

これは「チート・ウェイ」ではありません。実際、それは非常に一般的なルビーのイディオムで、「メモ」と呼ばれています。 –

関連する問題