散列上的 splat 将其转换为数组。
[*{foo: :bar}] # => [[:foo, :bar]]
这里是否存在一些隐藏机制(例如隐式类转换),或者它是一个内置的原始特性?
除了数组之外,
nil
在 Ruby 1.9 下,splat 运算符是和散列唯一消失/改变的东西吗?
问问题
4657 次
1 回答
14
splat 将尝试将对象显式转换为数组。
为此,它将发送to_a
并期待Array
一个结果。
class Foo
def to_a
[1,2,3]
end
end
a, b, c = *Foo.new
a # => 1
如果对象不响应to_a
,则没有效果,例如[*42] == [42]
许多内置类实现to_a
. 尤其:
- (因为它们包括
Enumerable
)Array
Hash
Range
IO
和File
Enumerator
Enumerator::Lazy
(红宝石 2.0)Set
和SortedSet
- (附加课程)
NilClass
MatchData
OpenStruct
Struct
Time
Matrix
和Vector
因此,所有这些都可以被喷溅:
match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
于 2013-01-14T01:45:32.777 回答