语法[*a..b]在Ruby中意味着什么?

Jus*_*rce 8 ruby syntax operators splat

注意:在GitHub上的 mischa的splat有很多很酷的交互式示例*在行动中.

通过谷歌搜索,我发现在Ruby中迭代一系列数字的一种方法(你的经典C风格的循环)

for (i = first; i <= last; i++) {
  whatever(i);
}
Run Code Online (Sandbox Code Playgroud)

是做这样的事情

[*first..last].each do |i|
  whatever i
end
Run Code Online (Sandbox Code Playgroud)

但是这种[*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
    ^
Run Code Online (Sandbox Code Playgroud)

我在网上看到的所有内容都讨论了一元星号对扩展和折叠传递给方法的参数很有用,对于可变长度参数列表非常有用

def foo(*bar)
  bar 
end

foo 'tater' # => ["tater"]
foo 'tater', 'tot' # => ["tater", "tot"]
Run Code Online (Sandbox Code Playgroud)

我得到了,但我不知道它如何适用于上面我的块示例中的扩展.

要清楚,我知道Ruby Way是迭代数组或集合,而不是使用数组长度并使用整数索引进行迭代.但是,在这个例子中,我真的在处理一个整数列表.:)

Dig*_*oss 12

[*1..10]
Run Code Online (Sandbox Code Playgroud)

是一样的

(1..10).to_a # call the "to array" method
Run Code Online (Sandbox Code Playgroud)

Array您创建的类的实例实现,Enumerable以便您的循环工作.在定义to_a方法的类上,可以使用带括号的splat运算符语法.Splat做的不仅仅是打电话#to_a,而且值得谷歌搜索.

现在,在你的情况下,Range类本身已经是一个Enumerable所以你可以这样做:

(first..last).each do |v| 
  ...
end
Run Code Online (Sandbox Code Playgroud)