gpt4 book ai didi

ruby - 就地修改数组 - Ruby

转载 作者:数据小太阳 更新时间:2023-10-29 07:55:51 25 4
gpt4 key购买 nike

我想知道为什么以下不会就地修改数组。

我有这个:

@card.map!.with_index {|value, key|  key.even? ? value*=2 : value}

它只是遍历一个数组,并将所有偶数键的值加倍。

然后我做:

@card.join.split('').map!{|x| x.to_i}

它将数组连接成一个巨大的数字,将它们拆分成单独的数字,然后将它们映射回数组中的整数。从第一步到第二步的唯一真正变化是第一步看起来像 a=[1,2,12],第二步看起来像 a=[1,2,1,2]。第二步,虽然我用的是.map!当我 p @card 时,它在第一步之后看起来完全一样。如果我想继续使用新数组,我必须将第二步 = 设置为某个值。为什么是这样? .map!第二步不是就地修改数组吗?还是方法的链接否定了我这样做的能力?干杯。

最佳答案

tldr:如果链中的每个方法都是就地修改方法,则方法链只会就地修改对象。

这种情况的重要区别在于您在对象上调用的第一个方法。您的第一个示例调用 map!,这是一种就地修改数组的方法。 with_index 在这个例子中并不重要,它只是改变了 map! 的行为。

您的第二个示例在您的数组上调用 joinjoin 不会原地更改数组,但会返回一个完全不同的对象:一个字符串。然后您拆分 字符串,这会创建一个新数组,而下面的map! 会在适当的位置修改 数组。

因此在您的第二个示例中,您需要再次将结果分配给您的变量:

@card = @card.join.split('').map{ |x| x.to_i }

可能还有其他方法可以计算出所需的结果。但是由于您没有提供输入和输出示例,因此不清楚您要实现的目标。

关于ruby - 就地修改数组 - Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25674507/

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