使用each和map来修改数组索引的范围

时间:2011-07-01 17:02:38

标签: ruby

以下代码:

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]

1 个答案:

答案 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]