我正在做一个简单的练习,在Ruby中创建一个Pez分发器类。这里有一个片段:
class PezDispenser
def initialize(flavors)
@flavors = flavors
end
def get_pez
@flavors.shift
end
end当我创建一个包含各种口味的新分发器时,然后调用#get_pez:
flavors = ["cherry", "grape"]
example = PezDispenser.new(flavors)
example.get_pez原始口味数组与@实例变量一起被修改:
p flavors #=> ["grape"]我发现我可以通过初始化来防止这种情况发生:
@flavors = Array.new(flavors)但是,我仍然不明白为什么@风味会被绑定到原始数组,否则。任何帮助或解释都将不胜感激!
发布于 2014-05-26 19:29:21
将初始化方法更改为
def initialize(flavors)
@flavors = flavors.clone
end否则,您将跟踪原始口味,这是通过引用传递的。
通过将clone操作放入initialize中,可以将@flavors状态与外部隔离开来。如果有人在类之外修改原始flavors数组,您不会对这种行为感到惊讶,您不会通过对克隆副本的操作来修改原始flavors,也不会指望用户记住手动执行克隆。
https://stackoverflow.com/questions/23876407
复制相似问题