更改默认的Ruby参数

时间:2009-08-26 13:09:44

标签: ruby

我想更改传递给Ruby函数的默认参数。例如,而不是每次写作

[1,2,3].do_stuff(:option => ' my option ')

我想修改默认值,以便我可以写

[1,2,3].do_stuff

更改默认参数的最简单,最干净,最类似Ruby的方法是什么?

3 个答案:

答案 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。)