Ruby 修改实例变量也会修改原始数组

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

我正在做一个简单的练习,用Ruby创建一个Pez分发器类。下面是一个片段:

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