我有以下方法:
def num n
n += 10
end
def arr a
a << "TEST"
end
分别在数字和数组上调用方法后,将更改数组:
x = 10
num(x)
x # => 10
z = [1, 'hi', "Byron"]
arr(z)
z # => [1, 'hi', "Byron", "TEST"]
有人能指出我正确的方向吗?
答案 0 :(得分:0)
调用z = [...]
时,您将在内存中创建Array的新实例,并将对它的引用存储在局部变量z中。
z = ['foo']
b = z
y = ['foo']
z.object_id # => 70314403278880
b.object_id # => 70314403278880 (same object)
y.object_id # => 70314411394940 (a different object)
调用arr(z)
时,实际上传递给该方法的是对数组实例的引用,而不是数组本身或指向局部变量的指针。
当引用指向数组时,您可以对其执行操作,例如添加元素。字符串和其他“非恒定”对象也是如此。您不能修改号码。
调用x = 10
时,您正在将10
(通常为21
)的对象ID分配给局部变量x
。
x = 10
y = x
z = 10
x.object_id # => 21
y.object_id # => 21
z.object_id # => 21
呼叫num(x)
时,实际上是在呼叫num(x.object_id)
。方法局部变量n
用于存储引用,但是该方法从不接收对您使用的局部变量x
的引用,x
将不再是这种情况。
方法执行n += 10
时,它将更改n
指向的内容,而不是x
指向的内容。
因此,在某种程度上,您的示例“尝试”执行的是10 = 10 + 10
。此后,10
的值将从此开始为20,而10 + 1
现在将返回21
。
其他类似行为的对象包括true
,false
,:symbols
。