如何确定是否在ruby方法中给出了可选参数

时间:2012-01-02 21:12:29

标签: ruby optional-parameters

我有一个带有可选参数的方法。我怎样才能决定是否给出了论证?

我提出了以下解决方案。我问这个问题,因为我对他们中的任何一个都不满意。还有一个更好的存在吗?

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。

2 个答案:

答案 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