在“nil”上双击

saw*_*awa 5 ruby hash literals splat double-splat

我的理解是,非数组对象上的单个 splat 调用to_a然后将元素分离。由于nil.to_a被定义为[],因此会发生以下转换:

[:foo, *nil, :bar]
# => [:foo, *nil.to_a, :bar]
# => [:foo, *[], :bar]
# => [:foo, :bar]
Run Code Online (Sandbox Code Playgroud)

通过类比,我认为非哈希对象上的 double 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}
Run Code Online (Sandbox Code Playgroud)

但实际上,它会引发一个错误:no implicit conversion of nil into Hash。为什么它会这样?

编辑我不是在问设计背后的原因。我想问我关于双打的想法哪里错了。

vut*_*ran 6

嗯,这是我们人类识别模式和预测事物的超能力。然而,这并不总是正确的。这是一个例子。Ruby 在 splat 和 double splat 方面并不一致。您的思维方式是“记住”的好方法,但这并不完全是 Ruby 在 splats 上工作的方式。

有关更多详细信息,请参阅此错误报告。在此错误报告中,Ruby 的作者 Matz 宁愿删除能够 splat 的功能nil,也不愿向nil.