我的理解是,非数组对象上的单个 splat 调用to_a
然后将元素分离。并且由于nil.to_a
定义为[]
,因此会发生以下转换:
[:foo, *nil, :bar]
# => [:foo, *nil.to_a, :bar]
# => [:foo, *[], :bar]
# => [:foo, :bar]
以此类推,我认为非散列对象上的双重 splat 调用to_h
然后将键值对分开。由于nil.to_h
被定义为{}
,我预计会发生以下转换:
{"foo" => 1, **nil, "bar" => 2}
# => {"foo" => 1, **nil.to_h, "bar" => 2}
# => {"foo" => 1, **{}, "bar" => 2}
# => {"foo" => 1, "bar" => 2}
但实际上,它引发了一个错误:no implicit conversion of nil into Hash
. 为什么它会这样?
编辑我不是在问设计背后的原因。我在问我关于双 splat 的想法哪里错了。