我正在做一个简单的练习,用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,也不会指望用户记住手动执行克隆。

10-08 00:42