【发布时间】:2012-12-27 12:44:13
【问题描述】:
-
散列上的 splat 将其转换为数组。
[*{foo: :bar}] # => [[:foo, :bar]]这里是否存在一些隐藏机制(例如隐式类强制转换),或者它是一个内置的原始特性?
除了数组之外,
nil和散列是唯一在 Ruby 1.9 下使用 splat 运算符消失/更改的东西吗?
【问题讨论】:
标签: ruby hash ruby-1.9 null splat
散列上的 splat 将其转换为数组。
[*{foo: :bar}] # => [[:foo, :bar]]
这里是否存在一些隐藏机制(例如隐式类强制转换),或者它是一个内置的原始特性?
除了数组之外,nil 和散列是唯一在 Ruby 1.9 下使用 splat 运算符消失/更改的东西吗?
【问题讨论】:
标签: ruby hash ruby-1.9 null 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)
ArrayHashRangeIO 和 File
EnumeratorEnumerator::Lazy (Ruby 2.0)Set 和 SortedSet
NilClassMatchDataOpenStructStructTimeMatrix 和 Vector
所有这些都可以被喷溅:
match, group, next_group = *"Hello, world".match(/(.*), (.*)/)
group # => "Hello"
【讨论】:
nil 在 Ruby 1.9 下消失,这不适合没有效果的情况,所以我猜这是唯一的例外。我说的对吗?
nil。编辑答案。 NilClass 实现了to_a(通过返回[]),所以这不是特例。没有效果意味着[*nil] 将是[nil] 而不是[]