A splat on a hash converts it into an array.
[*{foo: :bar}] # => [[:foo, :bar]]
Is there some hidden mechanism (such as implicit class cast) going on here, or is it a built-in primitive feature?
Besides an array, are
nil
and hash the only things that disappear/change with the splat operator under Ruby 1.9?
Splat on a hash
A splat will attempt an explicit conversion of an object to an Array.
To do this, it will send to_a
and expect an Array
as a result.
class Foo
def to_a
[1,2,3]
end
end
a, b, c = *Foo.new
a # => 1
If the object does not respond to to_a
, then there is no effect, e.g. [*42] == [42]
Many builtin classes implement to_a
. In particular:
- (because they include
Enumerable
)Array
Hash
Range
IO
andFile
Enumerator
Enumerator::Lazy
(Ruby 2.0)Set
andSortedSet
- (additional classes)
NilClass
MatchData
OpenStruct
Struct
Time
Matrix
andVector
All these can thus be splatted:
match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
Oh, forgot about
nil
. Edited answer. NilClass
implements to_a
(by returning []
), so it's not a special case. No effect would mean that [*nil]
would be [nil]
instead of []
–
Godbey © 2022 - 2024 — McMap. All rights reserved.
nil
disappears Under Ruby 1.9, and this does not fit the case of there being no effect, so this is the only exception, I guess. Am I right? – Varela