注意: 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