【发布时间】:2014-07-22 00:56:00
【问题描述】:
下面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)
这里发生了什么?
【问题讨论】:
-
有趣的是,这破坏了引用透明度,尝试使用
b = *nil; method(b)效果很好。 -
在一个不太相关的注释中,我会担心调用方法
method。它对我的pry做了一些可怕的事情(开始打印:inspect)。我假设你不会正常这样做,但我认为这很有趣,所以我想我会提到它,如果有人能告诉我是什么原因造成的,我会很感兴趣。 -
好吧,我不认为我真的能做到这一点。问题是我正在做一些元编程,其中经过的东西可能是 any 值,包括 nil,但可能是数组。所以我有点需要它是
method(*b)。是的,方法的名称“方法”并不好。这里只是一个例子。 -
我怀疑它可能有一些东西,而 nil 不是一个合适的对象或其他东西。但很高兴知道。
-
我同意很高兴知道,这就是为什么我想密切关注这个问题(以及为什么我支持你),但是在这种情况下,你可以通过有一个额外的一行写着
b= *b,因为这会将nil强制转换为[],并使数组保持不变。