星号中的星号是什么意思?

时间:2014-06-04 11:15:47

标签: ruby

这两行在Ruby中具有相同的含义,我从某处看到它 如果我设置a = 1 b = 10,它应该给我1~10的数字, 但我不知道为什么在a

之前需要*
(a..b).to_a.sample
[*a..b].sample

3 个答案:

答案 0 :(得分:2)

*a..b没有只是调用Enumerable#to_a,(它确实称之为,但这只是其真正目的的副作用)一元{{ ruby中的1}}运算符将*扩展为包含Enumerable s。像这样:

Array

这也已经在enumerables上实现了,但是为了使它能够工作,Ruby必须首先在它上面调用[*[1,2]] # => [1, 2] 来" cast"可枚举成.to_a

答案 1 :(得分:2)

*将范围转换为参数列表:

[1..10]  #=> [1..10]                          (array with a single element)
[*1..10] #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]  (array with 10 elements)

就像将范围的元素作为多个参数传递给Array::[],而不是将范围的元素作为数组传递:

[(1..10).to_a] #=> [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]  (nested array)

答案 2 :(得分:1)

它被称为splat运算符(请参阅规范:https://github.com/rubyspec/rubyspec/blob/master/language/splat_spec.rb)。

*a..b将范围转换为数组元素(使用#to_a方法)并分配给外部数组(如果你已经在数组内部进行了扩展,它就不会创建内部数组)。