强制方法的默认值

时间:2017-03-19 01:13:19

标签: ruby

鉴于方法:

def foo(a,b=5,c=1)
    return a+(b*c)
end

正在运行foo(1)应该返回6。但是,您将如何做这样的事情:foo(1,DEFAULT,2)。我需要更改第三个值,但使用默认的第二个值。

你会怎么做? (注意:我不能只改变变量的顺序,因为它们是来自gem的方法的参数)

2 个答案:

答案 0 :(得分:9)

你不能用提出的术语来做。这种情况正是为什么在Ruby 2中引入了命名(关键字)参数的原因。但根据问题的条款,你的参数的默认值是不是命名

因此,它们是位置 - 这就是可选参数必须最后的原因 - 因此,规则必须使用至少一个参数调用此方法(因为{{1} }不是可选的),任何进一步的参数将按照提供的顺序使用来填充相应的参数。

因此,您可以提供aaa,或b以及ab。您无法单独提供ca,因为如果这些参数已命名,您可以轻松完成。

我想到了两个明显的解决方案。

  • 调用方法,提供第二个参数的默认值作为第二个参数。大概你知道它是什么,所以它并不是很困难:

    c
  • 编写一个执行相同操作的trampoline方法,但参数 的位置为:

    foo(1,5,2)
    

答案 1 :(得分:2)

一种解决方案是默认为nil,然后默认为代码正文:

def foo(a,b=nil,c=nil)
  b ||= 5
  c ||= 1

  a + (b * c)
end

或者你可以将其作为计算的一部分:

def foo(a,b=nil,c=nil)
  a + (b || 5) * (c || 1)
end