更改默认Ruby参数
我想更改传递给Ruby函数的默认参数。例如,不是每次都写更改默认Ruby参数,ruby,Ruby,我想更改传递给Ruby函数的默认参数。例如,不是每次都写 [1,2,3].do_stuff(:option => ' my option ') 我想修改默认值,以便可以编写 [1,2,3].do_stuff 更改默认参数的最简单、最干净、最像Ruby的方法是什么? >> [1, 2, 3].do_stuff => Result I get >> [1, 2, 3].do_stuff :an_option => a_value => Result
[1,2,3].do_stuff(:option => ' my option ')
我想修改默认值,以便可以编写
[1,2,3].do_stuff
更改默认参数的最简单、最干净、最像Ruby的方法是什么?
>> [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
更新:删除反向合并!附属国。(现在正在寻找使用[]=method的更好替代方法)您是否希望为自己没有编写的代码找到解决方案?我知道有两种选择 您自己编写的代码:
def some_method_you_wrote(options)
变成:
def some_method_you_wrote(options = { :option1 => 'value' })
(斯瓦南德的回答也很好)
对于您没有编写的代码,请查看别名方法。(Rails为此提供了一个名为alias\u method\u chain
,IIRC)。(从您原来的问题中删除)
我假设您谈论的是一个已经存在的方法数组#do_东西,但是您希望稍微修改它(在您的例子中,通过更改默认参数)
贴子是一种很好的方式。它不会遇到与alias技术相同的问题,因为没有遗留的“旧”方法
下面是如何将该技术用于示例问题(使用ruby 1.9测试)
如果上面的代码令人困惑,您可能还需要仔细阅读。请注意,旧的\u-do\u内容在end语句之后超出了范围,因此这对于以后使用数组来说不是问题。这种方法的问题是,如果选项“option1”在没有“option1”键集的情况下传入选项哈希,则不会设置选项“option1”。
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