gpt4 book ai didi

ruby - 这两段代码有什么区别?

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:47 28 4
gpt4 key购买 nike

打印1:

def sum(i)
i=i+[2]
end

$x=[1]
sum($x)
print $x

打印12:

def sum(i)
i.push(2)
end

$x=[1]
sum($x)
print $x

后者是修改全局变量$x。为什么它在第二个例子中被修改而不是在第一个例子中?类 Array 的任何方法(不仅是 push)都会发生这种情况吗?

最佳答案

变量范围在这里无关紧要。

在第一段代码中,您仅使用赋值运算符= 为变量i 赋值,而在第二段代码中,您正在修改$x (也称为i)使用破坏性方法push。赋值从不修改任何对象。它只是提供一个名称来引用一个对象。方法要么是破坏性的,要么是非破坏性的。 Array#pushString#concat 等破坏性方法会修改接收者对象。 Array#+String#+ 等非破坏性方法不会修改接收者对象,而是创建一个新对象并返回该对象,或者返回一个已经存在的对象。

回复您的评论

是否可以修改接收者取决于接收者对象的类。对于数组、散列、字符串等,据说可变,可以修改接收者。对于被称为不可变的数字等,这是不可能做到的。

关于ruby - 这两段代码有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22166576/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com