这两行在Ruby中具有相同的含义,我从某处看到它
如果我设置a = 1 b = 10,它应该给我1~10的数字,
但我不知道为什么在a
(a..b).to_a.sample
[*a..b].sample
答案 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
方法)并分配给外部数组(如果你已经在数组内部进行了扩展,它就不会创建内部数组)。