以下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)
这里发生了什么?
答案 0 :(得分:6)
如果对象不是数组并且在其上定义了*
,则splat运算符to_a
首先将to_a
应用于该对象。对于数字,假类和字符串,to_a
未定义,它们仍然存在。对于nilclass,定义了to_a
并返回一个空数组。当它们被喷溅时,数字,假类和字符串保持不变,但空数组变得没有任何东西。另请参阅this question的答案。