在nil上传递splat作为参数

时间:2014-06-01 23:27:03

标签: ruby arguments null 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"

使用nil,我希望获得nil,而不是参数错误:

b = nil
some_method(*b) # => ArgumentError: wrong number of arguments (0 for 1)

这里发生了什么?

1 个答案:

答案 0 :(得分:6)

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