给定以下方法:
def foo(a,b=5,c=1)
return a+(b*c)
end
运行
foo(1)
应该返回6
。然而,如果这样写:foo(1,默认值,2)
,我该怎么做才能更改第三个值但仍使用默认的第二个值呢?请问应该如何操作?(注意:我不能只更改变量的顺序,因为它们是来自gem方法的参数。)
给定以下方法:
def foo(a,b=5,c=1)
return a+(b*c)
end
foo(1)
应该返回6
。然而,如果这样写:foo(1,默认值,2)
,我该怎么做才能更改第三个值但仍使用默认的第二个值呢?根据问题的条件,您不能按照所提出的方式完成。这正是 Ruby 2 中引入命名(关键字)参数的原因。但是,根据问题的要求,具有默认值的参数不是命名参数。
因此,它们是位置参数——这就是为什么可选参数必须放在最后的原因,并且规则是,必须使用至少一个参数调用此方法(因为 a
不是可选参数),并且任何进一步的参数将按照提供的顺序用于填充相应的参数。
因此,您可以提供 a
、a
和 b
或 a
、b
和 c
。如果这些参数是命名参数,则不能仅提供 a
和 c
。
因此,有两个明显的解决方案。
foo(1,5,2)
编写一个跳板函数(trampoline method),与之前的函数相同,但参数 已命名:
def foo(a,b=5,c=1)
return a+(b*c)
end
def bar(a,b:5,c:1)
return foo(a,b,c)
end
bar(1,c:2) # => 11
foo
的默认值发生更改,那么这个包装方法也必须进行更改。 - tadman一种解决方案是默认为 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
foo
的定义不由他决定。 - matt
foo(1) #=> 5
。 - Cary Swovelanda*(b*c)
。) - Cary Swoveland