鉴于方法:
def foo(a,b=5,c=1)
return a+(b*c)
end
正在运行foo(1)
应该返回6
。但是,您将如何做这样的事情:foo(1,DEFAULT,2)
。我需要更改第三个值,但使用默认的第二个值。
你会怎么做? (注意:我不能只改变变量的顺序,因为它们是来自gem的方法的参数)
答案 0 :(得分:9)
你不能用提出的术语来做。这种情况正是为什么在Ruby 2中引入了命名(关键字)参数的原因。但根据问题的条款,你的参数的默认值是不是命名
因此,它们是位置 - 这就是可选参数必须最后的原因 - 因此,规则必须使用至少一个参数调用此方法(因为{{1} }不是可选的),任何进一步的参数将按照提供的顺序使用来填充相应的参数。
因此,您可以提供a
,a
和a
,或b
以及a
和b
。您无法单独提供c
和a
,因为如果这些参数已命名,您可以轻松完成。
我想到了两个明显的解决方案。
调用方法,提供第二个参数的默认值作为第二个参数。大概你知道它是什么,所以它并不是很困难:
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