1

我所拥有的是:

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]
4

2 回答 2

3

在 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]

上面的两个示例将索引留给循环构造,这很好,因为您不必担心这一点。

于 2014-01-16T17:45:23.343 回答
1

写成

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. 你的首字母z1. 所以在你的第一次z = z+1评估中,它是2,下一次迭代它再次增加1,所以值z3,在最后一次传递中的方式z相同4。所以最后你得到了新的数组[2, 3, 4]

一种红宝石方式:

y = 16
3.times.map{|i| 10*y**i}  # => [10, 160, 2560]
于 2014-01-16T17:37:48.123 回答