无法添加到实例的散列(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
答
@马特的解决方案工作。
我只是补充一点,我没有理由为什么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”。 –
每次调用'pets'都会为'@ pets'分配一个新的散列。将任务移入'initialize'或使用'@pets || = {...}'。 – Stefan
另外,我相信你想做'self.pets [:fishes] .push(Fish.new(name))''。否则,你只需每次设置单个“Fish”实例的关键字。 – John
谢谢Stefan。这工作。我还没有学过|| =呢。有没有另一种方法来做到这一点?我觉得这是一个骗子的出路,因为我写了糟糕的代码? 另外,约翰,我只是注意到,当修复代码。不管怎么说,还是要谢谢你! –