我正在做一个简单的练习,用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
原始的flavors数组与@flavors实例变量一起修改:
p flavors #=> ["grape"]
我发现可以通过初始化来防止这种情况:
@flavors = Array.new(flavors)
但我仍然不明白为什么@flavors会与原始数组绑定任何帮助或解释将不胜感激!
最佳答案
将初始化方法更改为
def initialize(flavors)
@flavors = flavors.clone
end
否则,您将跟踪通过引用传递的原始口味。
通过将
clone
操作置于initialize
中,可以将@flavors
状态与外部隔离如果有人在类之外修改原始flavors
数组,您不会对这种行为感到惊讶,也不会通过对克隆副本的操作修改原始flavors
,也不会指望用户记住手动执行克隆。