散列上的 splat 将其转换为数组。
[*{foo: :bar}] # => [[:foo, :bar]]
这里是否存在某种隐藏机制(例如隐式类转换),或者它是一种内置的原始特征?
除了数组,
nil
和 hash 是唯一在 Ruby 1.9 下随 splat 运算符消失/改变的东西吗?
最佳答案
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
)数组
哈希
范围
IO
和File
枚举器
Enumerator::Lazy
(Ruby 2.0)Set
和SortedSet
- (附加类(class))
NilClass
匹配数据
OpenStruct
结构
时间
矩阵
和向量
因此,所有这些都可以展开:
match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
关于ruby - Splat 在哈希上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14303499/