我所拥有的是:
array.map!{
|c| c*(y**(z-1))
z=z+1
}
array
包含
[10, 10, 10]
输出不是我想要的,它是
[2, 3, 4]
我希望 z 用作计数器,它之前定义为 1,而 y 之前定义。也可以是 16 或 36(取决于用户输入)
因此,如果我用 3 个 10 输入相同的数组。我想array
成为(当 y 为 16 时):
[10, 160, 2560]
我所拥有的是:
array.map!{
|c| c*(y**(z-1))
z=z+1
}
array
包含
[10, 10, 10]
输出不是我想要的,它是
[2, 3, 4]
我希望 z 用作计数器,它之前定义为 1,而 y 之前定义。也可以是 16 或 36(取决于用户输入)
因此,如果我用 3 个 10 输入相同的数组。我想array
成为(当 y 为 16 时):
[10, 160, 2560]
在 ruby 中有更多惯用的方法来实现这一点,例如:
y = 16
array = Array.new(3) { |i| 10*(y**i) }
# => [10, 160, 2560]
或者,如果内容并不总是常量10
,则有:
y = 16
array = [10, 10, 10]
array.map!.with_index { |c, i| c*(y**i) }
# => [10, 160, 2560]
上面的两个示例将索引留给循环构造,这很好,因为您不必担心这一点。
写成
z = 1; y =16
array = [10, 10, 10]
array.map { |c| z=z+1 ; c*(y**(z-2)) }
# => [10, 160, 2560]
使用Array#map
, 块返回每次迭代的最后一个表达式。在你的情况下是z = z + 1
. 你的首字母z
是1
. 所以在你的第一次z = z+1
评估中,它是2
,下一次迭代它再次增加1
,所以值z
是3
,在最后一次传递中的方式z
相同4
。所以最后你得到了新的数组[2, 3, 4]
。
一种红宝石方式:
y = 16
3.times.map{|i| 10*y**i} # => [10, 160, 2560]