在nil上传递splat作为参数

Aut*_*ico 5 ruby null arguments splat

b下面的所有值都让我用*args语法调用方法.

def some_method(a)
   puts a
end

b = 1
some_method(*b) # => 1

b = false
some_method(*b) # => false

b = "whatever"
some_method(*b) # => "whatever"
Run Code Online (Sandbox Code Playgroud)

有了nil,我期望得到nil,而不是参数错误:

b = nil
some_method(*b) # => ArgumentError: wrong number of arguments (0 for 1)
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

saw*_*awa 6

如果对象不是数组并且在其上定义,则splat运算符*首先应用于to_a该对象to_a.对于数字,假类和字符串,to_a没有定义,它们仍然存在.对于nilclass,to_a定义并返回一个空数组.当它们被喷溅时,数字,假类和字符串保持不变,但空数组变得没有任何东西.另请参阅此问题的答案.