语法[*a..b]在Ruby中是什么意思?

语法[*a..b]在Ruby中是什么意思?,ruby,syntax,operators,splat,Ruby,Syntax,Operators,Splat,注意:Misha's有很多很酷的互动例子 通过谷歌搜索,我发现了一种在Ruby(您的经典C风格for循环)中迭代一系列数字的方法 但是[*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

注意:Misha's有很多很酷的互动例子

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

但是
[*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的方法是迭代数组或集合,而不是使用数组长度和整数索引进行迭代。但是,在本例中,我实际上处理的是一个整数列表。:)

它被称为splat操作符。如果在某些位置(如参数位置或数组)内使用它,它将展开为其元素:

a = [1]
[*a, 3] # => [1, 3]
b = [1, 2]
[*b, 3] # => [1, 2, 3]
您不能将其裸露使用或在以下范围内使用:

*a..3 # => error.
(*a..3) # => error.
当您拥有非数组的内容时,它将返回自身:

a = 1
[*a, 3] # => [1, 3]
是同一件事吗

(1..10).to_a # call the "to array" method
您创建的
数组
类的实例实现了
可枚举
,因此循环可以工作。在定义
方法的类上,可以使用带括号的splat运算符语法。不过,Splat做的远不止是调用
#调用a
,它本身就值得谷歌搜索

现在,在您的例子中,
范围
类本身已经是一个
可枚举的
,因此您可以执行以下操作:

(first..last).each do |v| 
  ...
end

[first..last]
是仅包含1个范围对象的数组
[*first..last]
是一个数组,其中包含作为参数列表发送的该范围的元素<代码>*
在参数列表的上下文中工作。

我的整个方法可能是错误的。我可能应该只做
(第一个..最后一个)。每个..
,但我仍然想知道那里发生了什么。:)还可以试试:
x=*0..5;px
a=[1,2,3];b=[4,5,6];c=[*a,*b];p c
(Ruby 1.9+)您还可以使用
first.upto(last){i | | | | | | | | | | | | | | | | | | | | | | | | | |
[*1..10]
(1..10).to_a # call the "to array" method
(first..last).each do |v| 
  ...
end