无法添加到实例的散列(ruby)

问题描述:

我无法使用#buy_fish添加到实例的#pets散列。它成功返回正在添加到散列的内容,但散列不会更改。无法添加到实例的散列(ruby)

所有人类别

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 

鱼类

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

谢谢Stefan。这工作。我还没有学过|| =呢。有没有另一种方法来做到这一点?我觉得这是一个骗子的出路,因为我写了糟糕的代码? 另外,约翰,我只是注意到,当修复代码。不管怎么说,还是要谢谢你! –

@马特的解决方案工作。

我只是补充一点,我没有理由为什么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 

正如斯蒂芬指出的那样,每次调用pets asssigns一个新的哈希至@pets。在宠物方法中加入||=解决了这个问题。

代码

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

这不是一个“作弊方式”。事实上,这是一种非常常见的红宝石成语,被称为“memoization”。 –