Ruby 修改实例变量也会修改原始数组
我正在做一个简单的练习,用Ruby创建一个Pez分发器类。下面是一个片段:Ruby 修改实例变量也会修改原始数组,ruby,arrays,instance-variables,Ruby,Arrays,Instance Variables,我正在做一个简单的练习,用Ruby创建一个Pez分发器类。下面是一个片段: class PezDispenser def initialize(flavors) @flavors = flavors end def get_pez @flavors.shift end end 当我用一系列口味创建一个新的分配器,然后调用#get#u pez: 原始的flavors数组与@flavors实例变量一起修改: p flavors
class PezDispenser
def initialize(flavors)
@flavors = flavors
end
def get_pez
@flavors.shift
end
end
当我用一系列口味创建一个新的分配器,然后调用#get#u pez:
原始的flavors数组与@flavors实例变量一起修改:
p flavors #=> ["grape"]
我发现我可以通过初始化来防止这种情况:
@flavors = Array.new(flavors)
但是我仍然不明白为什么@flavors会绑定到原始数组。任何帮助或解释都将不胜感激 将初始化方法更改为
def initialize(flavors)
@flavors = flavors.clone
end
否则,您将跟踪通过引用传递的原始味道
通过将
clone
操作置于initialize
中,可以从外部隔离@flavors
状态。如果有人在您的类之外修改原始flavors
数组,您不会对这种行为感到惊讶,您不会通过对克隆副本的操作来修改原始flavors
,您也不会指望用户记得手动进行克隆。谢谢您的回答,这似乎是一个安全的解决方案。
def initialize(flavors)
@flavors = flavors.clone
end