注意: mischa的splat on GitHub有很多很酷的互动*的实例。Ruby中的语法[* a..b]是什么意思?
通过google搜索,我发现有一个办法在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)。每个...',但我仍然想知道那里发生了什么。:) – 2011-05-12 17:17:04
也请试试:'x = * 0..5; px'和'a = [1,2,3]; b = [4,5,6]; c = [* a,* b]; pc '(Ruby 1.9+) – Phrogz 2011-05-12 17:26:58
你也可以使用'first.upto(last){| i | ...}'或'first.step(last){| i | ...}(后一种方法允许你以1以外的增量步进) – Phrogz 2011-05-12 17:32:35