我有一个带有可选参数的方法.我如何判断是否给出了论证?
我提出了以下解决方案.我问这个问题,因为我对他们中的任何一个都不满意.还有一个更好的存在吗?
nil 作为默认值def m(a= nil)
if a.nil?
...
end
end
Run Code Online (Sandbox Code Playgroud)
这个的缺点是,无法确定是否没有参数或nil给出.
NoArgument为默认值class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
Run Code Online (Sandbox Code Playgroud)
是否nil给出了可以决定,但实例存在同样的问题NoArgument.
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
Run Code Online (Sandbox Code Playgroud)
在这个变体中,总是可以决定是否给出了可选参数.但是Proc#arity,此方法的更改从1更改为-1(不是这样,请参阅注释).它的缺点是文档更糟糕,需要手动引发ArgumentError.