数组方法的范围

时间:2018-11-19 22:10:16

标签: ruby local-variables

我有以下方法:

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"]

有人能指出我正确的方向吗?

1 个答案:

答案 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

其他类似行为的对象包括truefalse:symbols