更改默认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

我想更改传递给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 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