我拥有的是:
array.map!{
|c| c*(y**(z-1))
z=z+1
}
array
包含
[10, 10, 10]
输出不是我想要的,它是
[2, 3, 4]
我希望z作为计数器运行,之前定义为1,y之前已定义。另外,16或36(取决于用户输入)
所以如果我用3 10s输入相同的数组。我希望array
成为(当y为16时):
[10, 160, 2560]
答案 0 :(得分: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]
以上两个例子将索引留给了循环结构,这很好,因为你担心的事情要少一些。
答案 1 :(得分:1)
将其写为
z = 1; y =16
array = [10, 10, 10]
array.map { |c| z=z+1 ; c*(y**(z-2)) }
# => [10, 160, 2560]
使用Array#map
,block返回每次迭代的最后一个表达式。在你的情况下它是z = z + 1
。您的初始z
为1
。因此,在您评估的第一个z = z+1
中,它是2
,下一次迭代再次增加1
,因此z
的值为3
,在最后一次通过z
变为4
。所以最后你得到了新的数组[2, 3, 4]
。
一种Rubyish方式:
y = 16
3.times.map{|i| 10*y**i} # => [10, 160, 2560]