gpt4 book ai didi

arrays - 为什么这些函数之一改变了原始数组而不是另一个?

转载 作者:数据小太阳 更新时间:2023-10-29 08:35:34 26 4
gpt4 key购买 nike

通过查看这三个函数,我不确定我错过了什么。这些函数的预期结果是原始数组更改值,因此

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

第二个函数如何改变数组,而第三个函数却没有?

最佳答案

在上一个示例中,您将 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! 这样的东西存在时,这不是一个非常优雅的解决方案。

关于arrays - 为什么这些函数之一改变了原始数组而不是另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636530/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com