带控制流的破坏性地图方法返回意外的nils

时间:2015-08-07 21:23:29

标签: arrays ruby

运行时,它会正确地将3中的array更改为"blue",但会将所有其他元素更改为nil

array = [1, 2, 3, 4]
array.map! do |number|
  if number == 3
    array[number] = "blue"
  end
end

由于我引入了if语句,我希望它能将其他所有内容都留下来。有人可以解释为什么会发生这种情况以及如何让它只修改用if语句隔离的元素吗?

1 个答案:

答案 0 :(得分:1)

当你运行map!时:

  

为self的每个元素调用给定的块一次,替换为   元素与块返回的值。

因此,当数字不匹配3时,该块正在返回nil - 当它为3时,您实际上并不需要您正在使用的任务,只需{{1会产生同样的效果。

这应该完成你想要做的事情:

"blue"

请参阅http://ruby-doc.org/core-2.2.0/Array.html#method-i-map-21