我想更改传递给Ruby函数的默认参数。例如,而不是每次写作
[1,2,3].do_stuff(:option => ' my option ')
我想修改默认值,以便我可以写
[1,2,3].do_stuff
更改默认参数的最简单,最干净,最类似Ruby的方法是什么?
答案 0 :(得分:2)
>> [1, 2, 3].do_stuff
=> Result I get
>> [1, 2, 3].do_stuff :an_option => a_value
=> Result I really want, but don't want to specify the argument
我喜欢使用super
。除了更改默认参数外,它还允许我们为方法添加一些功能:
class Array
def do_stuff(options = {})
# Verify if caller has not passed the option
options[:argument_i_want_to_change] = default_value_i_want unless options.has_key? :argument_i_want_to_change
# call super
super
end
end
结果:
>> [1, 2, 3].do_stuff
=> Result that I really want
更新:删除了reverse_merge!依赖。 (现在寻找使用[] =方法的更好的替代方案)
答案 1 :(得分:1)
(从原来的问题转移)
我假设您正在讨论已经存在的方法Array#do_stuff,但您想稍微修改它(在您的情况下通过更改默认参数)。
帖子here提供了一种很好的方式。它没有与别名技术相同的问题,因为没有剩余的“旧”方法。
这里你可以将这个技术用于你的示例问题(用ruby 1.9测试)
class Array
old_do_stuff = instance_method(:do_stuff)
define_method(:do_stuff) { |options = {}|
options[:option] ||= " option "
old_do_stuff.bind(self).call(options)
}
end
如果上述代码令人困惑,您可能还需要在UnboundMethod上阅读。请注意,old_do_stuff在结束语句之后超出范围,因此对于将来使用Array不是问题。
答案 2 :(得分:0)
您是否想要自己编写的代码解决方案?我知道有两种选择。
你自己编写的代码:
def some_method_you_wrote(options)
变为:
def some_method_you_wrote(options = { :option1 => 'value' })
(Swanand的答案也很好)
对于您没有编写的代码,请查看别名方法。 (Rails为此提供了一个名为alias_method_chain
的东西,IIRC。)