2017-10-08 54 views
2

通过查看这三个函数,我不确定我错过了什么。 这些函数的期望的结果将是原始阵列变化值,从而为什么这些函数之一改变原始数组而不是另一个?

change_this = [6, 7, 8] 
array_times_two!(change_this) 
change_this == [12, 14, 16] => true 

下面的函数执行此

def array_times_two!(array) 
    array.map! {|x| x * 2} 
end 

也是如此这一个...

def array_times_two!(array) 
    array.each_with_index do |element, index| 
    array[index] = array[index] * 2 
    end 
    array 
end 

以下功能如何不会像其他功能一样改变数值?

def array_times_two!(array) 
    array = array.map {|x| x * 2} 
    array 
end 

如何在第二个函数变化的数组,但第三个是不是?

回答

4

在最后一个例子中,你有一个局部变量array。重新分配局部变量对原始变量没有影响。这是因为Ruby实际上是通过价值传递的,除了令人困惑的部分是那些值往往是对象引用,或者是指针的奇特术语。

虽然这样做的后果并不那么复杂:调用对象的方法可以通过修改该对象的内容。重新分配变量不能。

你的方法的第一个版本可能是最好的,但你可以使它更通用,如:

def multiply_by!(array, n = 2) 
    array.map! { |v| v * n } 
end 

您还可以通过使用一个方法调用应用更改“修复”的最后一个版本:

def array_times_two!(array) 
    array.replace(array.map {|x| x * 2}) 
end 

这就要求Array#replace踩原始对象的内容,并强制更改才能坚持下去。当存在诸如map!之类的东西时,这不是一个非常优雅的解决方案。

相关问题