【发布时间】:2011-08-24 07:38:21
【问题描述】:
注意:mischa 的 splat on GitHub 有很多很酷的 * 互动示例。
通过谷歌搜索,我发现了一种在 Ruby 中迭代一系列数字的方法(您的经典 C 风格 for 循环)
for (i = first; i <= last; i++) {
whatever(i);
}
要做这样的事情
[*first..last].each do |i|
whatever i
end
但是[*first..last] 语法到底发生了什么?我玩过irb,我看到了这个:
ruby-1.9.2-p180 :001 > 0..5
=> 0..5
ruby-1.9.2-p180 :002 > [0..5]
=> [0..5]
ruby-1.9.2-p180 :003 > [*0..5]
=> [0, 1, 2, 3, 4, 5]
ruby-1.9.2-p180 :004 > *0..5
SyntaxError: (irb):4: syntax error, unexpected tDOT2, expecting tCOLON2 or '[' or '.'
*0..5
^
我在网上阅读的所有内容都讨论了一元星号对于扩展和折叠传递给方法的参数很有用,对于可变长度参数列表很有用
def foo(*bar)
bar
end
foo 'tater' # => ["tater"]
foo 'tater', 'tot' # => ["tater", "tot"]
我明白了,但我看不出它如何应用于上面的块示例中进行的扩展。
明确地说,我知道 Ruby 方式是迭代数组或集合,而不是使用数组长度并使用整数索引进行迭代。然而,在这个例子中,我实际上是在处理一个整数列表。 :)
【问题讨论】:
-
我的整个方法可能是错误的。我可能应该只是在做
(first..last).each ...,但我仍然想知道那里发生了什么。 :) -
也可以试试:
x=*0..5;p x和a=[1,2,3];b=[4,5,6];c=[*a,*b];p c(Ruby 1.9+) -
您也可以使用
first.upto(last){ |i| ... }或first.step(last){ |i| ... }进行迭代(其中后一种方法允许您逐步递增,而不是1)
标签: ruby syntax operators splat