我正在通过一个简单的练习,在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
原始flavor数组与@flavors实例变量一起被修改:
p flavors #=> ["grape"]
我发现我可以通过初始化来阻止这种情况:
@flavors = Array.new(flavors)
但是我仍然不明白为什么@flavors会绑定到原始数组。任何帮助或解释将不胜感激!
答案 0 :(得分:3)
将初始化方法更改为
def initialize(flavors)
@flavors = flavors.clone
end
否则,您将跟踪通过引用传递的原始风格。
将clone
操作放入initialize
,可以将@flavors
状态与外界隔离开来。如果某人修改了您班级之外的原始flavors
数组,您将不会对此行为感到惊讶,您不会通过克隆副本上的操作修改原始flavors
,并且您不会依靠用户记住手动进行克隆。