将数组传递给 ruby 函数

Passing array to ruby function

好吧,我对 ruby 如何将它的参数传递给函数感到困惑。我在文档中读到 ruby 通过 value,但在我的情况下它看起来像是通过 referance 问题是:

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

调用此方法不应修改 arr 值,因为 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"

要理解这一点,您必须区分变量和该变量代表的含义。考虑以下示例:

items = [1, 2, 3]
# the variable items points to an array we just instantiated
items = [4, 5, 6]
# items now points to a new array

如果 ruby 通过引用传递参数,在方法中使用它接收到的参数这样做也会使调用者暴露给方法的变量指向新位置

items = [1, 2, 3]
def my_method array
    array = [4, 5, 6]
    return array
end
my_method(items) # --> [4, 5, 6]
items # --> [1, 2, 3]
# if ruby passed arguments by reference, items would now be [4, 5, 6]

现在 ruby 按值传递参数,但您收到的值是对内存中与被调用传递给您的相同位置的引用。换句话说,你得到的不是克隆、复制品,而是同一个对象。

items = [1, 2, 3]
def my_method array
    array << 4
    return array
end
my_method(items) # --> [1, 2, 3, 4]
items # --> [1, 2, 3, 4]

如果您希望您的方法对其参数没有副作用,您可以克隆它们。