【问题标题】:Passing array to ruby function将数组传递给 ruby​​ 函数
【发布时间】:2016-08-01 16:42:14
【问题描述】:

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

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"

【问题讨论】:

  • 引用就是一个值。除非你复制你在同一个数组上操作的数组。
  • 您需要复制一个对象或构造一个新对象,例如。 G。 def buble_sort(*arr)
  • 这与 pass-by-reference 或 pass-by-value 没有任何关系。两者的区别只有在你重新绑定引用时才能观察到,但你永远不会这样做,所以无论 Ruby 是按引用传递还是按值传递,结果实际上都是一样的。您所看到的只是可变状态。 Ruby 不是纯粹的函数式语言,它具有可变状态和副作用。这是一个可变状态的例子,也是一个为什么应该避免它的例子。

标签: ruby sorting pass-by-reference pass-by-value


【解决方案1】:

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

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]

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

【讨论】:

    猜你喜欢
    • 2016-11-23
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    相关资源
    最近更新 更多