修改实例变量也是修改原始数组

时间:2014-05-26 19:14:21

标签: ruby arrays instance-variables

我正在通过一个简单的练习,在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会绑定到原始数​​组。任何帮助或解释将不胜感激!

1 个答案:

答案 0 :(得分:3)

将初始化方法更改为

def initialize(flavors)
    @flavors = flavors.clone
end

否则,您将跟踪通过引用传递的原始风格。

clone操作放入initialize,可以将@flavors状态与外界隔离开来。如果某人修改了您班级之外的原始flavors数组,您将不会对此行为感到惊讶,您不会通过克隆副本上的操作修改原始flavors,并且您不会依靠用户记住手动进行克隆。