Ruby 如何知道具有默认值的参数是否得到显式参数?

Ruby 如何知道具有默认值的参数是否得到显式参数?,ruby,default,Ruby,Default,我有一个参数为默认值的方法。我需要知道该值是来自用户还是默认值。用户也可以发送默认值。我如何知道这些值来自何处?您可以使用Nobu Nakada在2004年提出的技巧: def some_method( a=(implicit_value=true; 1) ) puts "a=#{a}; was set #{ implicit_value ? :im : :ex }plicitly" end > some_method a=1; was set implicitly >

我有一个参数为默认值的方法。我需要知道该值是来自用户还是默认值。用户也可以发送默认值。我如何知道这些值来自何处?

您可以使用Nobu Nakada在2004年提出的技巧:

def some_method( a=(implicit_value=true; 1) )
    puts "a=#{a}; was set #{ implicit_value ? :im : :ex }plicitly"
end

> some_method
a=1; was set implicitly

> some_method 1
a=1; was set explicitly

> some_method 2
a=2; was set explicitly

这也会起作用,看起来不那么难看:

def my_method(a = implicit = 1)
  p a
  p implicit
end

# when calling without parameters then a = implicit = 1 is run, hence implicit is assigned a value 
> my_method
1
1

# when calling with a parameter then a = 1 statement is run. implicit will become nil here
> my_method 1 
1
nil

丑陋但聪明(或相反,不确定)以下方法也有效:
def some_方法(a=(implicit_value=1))。。。结束
(删除了
true;
)有趣的问题,但在概念上有疑问。用例是什么?我需要知道用户在输入区域中插入了一些值,或者只是单击了提交按钮。@tokland:有一些标准协议,例如在
Enumerable
中,要求您知道是否提供了可选参数。标准实现是用C、Java、C#等语言编写的,具有对解释器内部的特权访问,因此对他们来说这很简单。但是如果你想在Ruby中重新实现它们,你必须解决这样一个事实:Ruby标准协议需要基于算术的方法重载,但是Ruby语言不支持它。+1我同意,它不那么难看,这意味着更容易维护。但它仍然需要一些源代码中的“splainin”。