好吧,我对ruby如何将参数传递给函数感到困惑。我在文档中读到ruby通过value传递,但在我的例子中,它看起来像是通过value传递,问题是:
def buble_sort(arr)
unordered = true
while unordered
unordered = false
for i in (1..arr.size-1)
if(arr[i-1] > arr[i])
arr[i-1], arr[i] = arr[i], arr[i-1]
unordered = true;
end
end
end
arr
end
调用这个方法不应该修改req值,因为ruby是通过值传递的。但在我的例子中,它确实修改了原始数组。验证码:
p "#{arr} before sort" # => "[85, -4, 1, 2, 55, 23, 0] before sort"
p buble_sort(arr) # => [-4, 0, 1, 2, 23, 55, 85]
p "#{arr} after sort" # => "[-4, 0, 1, 2, 23, 55, 85] after sort"
2条答案
按热度按时间vlurs2pr1#
要理解这一点,你必须区分变量和这个变量代表什么。请考虑以下示例:
如果ruby通过引用传递参数,那么在方法中使用它接收的参数也会使调用者向方法公开的变量指向一个新位置
现在ruby通过值传递参数,但是你收到的值是对内存中相同位置的引用,就像被调用者传递给你的值一样。换句话说,你得到的不是一个克隆,一个复制,而是同一个对象。
如果你想让你的方法对它的参数没有副作用,你可以克隆它们。
blmhpbnm2#
在Ruby中,几乎所有的东西都是对象。在方法中,对象通过引用传递。
a是一个变量,它的值是数组的引用。
这里a的值是数组的引用,它在变量b中被接收。这意味着a和B都有值作为数组的引用。
这里B被赋予一个新的值,该值引用新数组。a仍然将原始数组的引用作为值。
数组是可变的,这意味着我们可以改变数组对象的内容。
将打印[1,5,3]
所有像数字这样的原始对象都是不可变对象。
a存储包含值5的整数对象的引用。
现在A存储包含值6的整数对象的引用。包含6的对象不同于包含5的对象。之前包含5的对象仍然包含5,但它的引用没有存储在任何地方。