【发布时间】:2012-02-01 02:04:52
【问题描述】:
我有一个带有可选参数的方法。我如何确定是否给出了参数?
我想出了以下解决方案。我问这个问题是因为我对其中任何一个都不完全满意。还有更好的吗?
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。
【问题讨论】:
-
所有方法中的
arity是-1。最后一个解决方案的唯一缺点是您必须手动检查是否给出了不超过一个参数,并且需要文档才能知道参数是什么。