以下代码:
a = [1,2,3,4,5]
b = a.each.map {|i| i = 0} # or b = a.map {|i| i = 0} does the same thing
按预期使b = [0,0,0,0,0]
是否有同样简洁的方法来改变范围? (例如:将[2..4]设置为0)
我在irb中搞砸了,但我的代码只返回被修改的元素
a = [1,2,3,4,5]
b = a[2..4].each.map {|i| i = 0}
使b = [0,0,0],其中我试图使b = [1,2,0,0,0]
答案 0 :(得分:5)
我不确定你在这里要做什么。
首先:您为什么要将Array
转变为Enumerator
,然后将map
转变为Enumerator
,而不是直接映射Array
?即为什么你有
b = a.each.map {|i| i = 0 }
而不仅仅是
b = a.map {|i| i = 0 }
另外,为什么要分配块局部变量i
但从未实际使用该变量?即你为什么不这样做?
b = a.map {|i| 0 }
当然,现在你根本没有使用i
...
b = a.map { 0 }
但是,由于b
的值实际上与a
的值完全没有任何关系,所以您可能也一样
b = [0] * a.size
同样的问题基本上也适用于您的第二个代码示例。同样,您完全忽略 a
的元素,因此使用map
根本没有任何意义。你可以做到
(b = a.dup)[2..4] = [0] * 3
或稍微更易读,分解为两个表达式
b = a.dup
b[2..4] = [0] * 3 # or ... = [0, 0, 0]