遗憾的是,大量方法以下列形式编写:
def my_method(foo = {}, bar = {})
# Do stuff with foo and bar
end
虽然我感谢不必在任何地方编写my_method({}, {})
我引用该方法,但使用第二个参数的默认值以外的其他内容使我使用第一个参数的默认值以外的其他内容 - my_method({}, foo: 'bar')
有没有办法告诉Ruby使用参数的默认值,当其他的,后面的参数需要使用默认值以外的东西?我希望以某种形式出现的东西my_method(__default__, foo: 'bar')
,但欢迎解决此问题核心的任何其他解决方案。
当API经历轻微(但重大)更改时,这将特别有用。它偶尔会导致很难发现错误:
# Original method
def foo(value = 'true', options = {})
# ...
end
# Defaults are updated slightly in a new version of the library
def foo(value = true, options = {})
# ...
end
# My code might break in an unexpected way now
foo('true', bar: 'baz')
答案 0 :(得分:7)
这是关键字参数(ruby 2的新用户)要解决的问题(前提是您控制了方法定义)。
def foo(a: {}, b: {})
"a: #{a}, b: #{b}"
end
foo # => "a: {}, b: {}"
foo(a: 1, b: 2) # => "a: 1, b: 2"
foo(a: 3) # => "a: 3, b: {}"
foo(b: 4) # => "a: {}, b: 4"
答案 1 :(得分:1)
您可以将代码重构为此类代码,因此仅当命名参数未提供值时才会将其指定为默认值。
def my_method(foo, bar)
foo ||= {}; bar ||= {};
#=> Do something with foo and bar now.
end
||=
运算符的作用是,如果变量未初始化或具有nil
值,则会在左侧为变量赋值。
您现在可以这样称呼它
my_method(nil, "I'm bar");
如果有任何机会,您希望将nil
作为值传递,那么这将失败。 Sergio Tulentsev的答案是要走的路。如果我知道的话,我已经提出了同样的建议。
答案 2 :(得分:1)
您可以将默认值设置为nil,然后处理方法正文中值的实际默认值。即。,
def my_method(first=nil, second=nil)
first_value = first || 1
second_value = second || 2
end
当您希望该值成为默认值时,可以传递'nil'。例如,
my_method(nil, 'second')
现在'first_value'为1,second_value为'second'。
编辑:虽然'nil'实际上不描述使方法使用其默认值的操作。考虑一下:
def my_method(first=:default, second=:default)
first_value = (first == :default ? 1 : first)
second_value = (second== :default ? 2 : second)
end
然后你可以这样做:
my_method(:default, 'second')
(但Sergio的答案确实是最好的=))