【发布时间】: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