首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改实例变量也是修改原始数组。

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

Stack Overflow用户
提问于 2014-05-26 19:14:21
回答 1查看 59关注 0票数 1

我正在做一个简单的练习,在Ruby中创建一个Pez分发器类。这里有一个片段:

代码语言:javascript
复制
class PezDispenser

    def initialize(flavors)
        @flavors = flavors
    end

    def get_pez
        @flavors.shift
    end

end

当我创建一个包含各种口味的新分发器时,然后调用#get_pez:

代码语言:javascript
复制
flavors = ["cherry", "grape"]
example = PezDispenser.new(flavors)
example.get_pez

原始口味数组与@实例变量一起被修改:

代码语言:javascript
复制
p flavors #=> ["grape"]

我发现我可以通过初始化来防止这种情况发生:

代码语言:javascript
复制
@flavors = Array.new(flavors)

但是,我仍然不明白为什么@风味会被绑定到原始数组,否则。任何帮助或解释都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-26 19:29:21

将初始化方法更改为

代码语言:javascript
复制
def initialize(flavors)
    @flavors = flavors.clone
end

否则,您将跟踪原始口味,这是通过引用传递的。

通过将clone操作放入initialize中,可以将@flavors状态与外部隔离开来。如果有人在类之外修改原始flavors数组,您不会对这种行为感到惊讶,您不会通过对克隆副本的操作来修改原始flavors,也不会指望用户记住手动执行克隆。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23876407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档