我有一个带有可选参数的方法。我怎样才能决定是否给出了论证?
我提出了以下解决方案。我问这个问题,因为我对他们中的任何一个都不满意。还有一个更好的存在吗?
nil
作为默认值def m(a= nil)
if a.nil?
...
end
end
这个的缺点是,无法判断是否没有参数或nil
。
NoArgument
作为默认值class NoArgument
end
def m(a= NoArgument.new)
if NoArgument === a
...
end
end
是否可以确定nil
,但NoArgument
的实例存在同样的问题。
def m(*a)
raise ArgumentError if m.size > 1
if m.size == 1
...
end
end
在此变体中,可以始终确定是否给出了可选参数。
但是,此方法的Proc#arity
已从1更改为-1(不是这样,请参阅注释)。它的缺点是文档更糟糕,需要手动引发ArgumentError。
答案 0 :(得分:15)
Jorg W Mittag有following code snippet可以做你想做的事情:
def foo(bar = (bar_set = true; :baz))
if bar_set
# optional argument was supplied
end
end
答案 1 :(得分:4)
怎么样
NO_ARGUMENT = Object.new
def m(a = NO_ARGUMENT)
if a.equal?(NO_ARGUMENT)
#no argument given
end
end