Изменение стандартных параметров Ruby - PullRequest
3 голосов
/ 26 августа 2009

Я хочу изменить аргументы по умолчанию, передаваемые в функцию Ruby. Например, вместо того, чтобы каждый раз писать

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

Я хочу изменить значения по умолчанию, чтобы я мог написать

[1,2,3].do_stuff

Какой самый простой, самый чистый, наиболее похожий на Ruby способ изменения параметров по умолчанию?

Ответы [ 3 ]

2 голосов
/ 26 августа 2009
>> [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 голос
/ 26 августа 2009

(перенесено из исходного вопроса)

Я предполагаю, что вы говорите о методе Array # do_stuff, который уже существует, но вы хотите немного его изменить (в вашем случае, изменив параметр по умолчанию).

Пост здесь дает хороший способ сделать это. Он не страдает от тех же проблем, что и метод псевдонима, так как не существует «старого» метода.

Вот, как вы могли бы использовать эту технику в своем примере задачи (протестировано с 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 выходит из области видимости после оператора end, поэтому это не проблема для использования Array в будущем.

0 голосов
/ 26 августа 2009

Вы хотите решение для кода, который вы не написали сами? Мне известны два варианта.

Код, который вы написали сами:

def some_method_you_wrote(options)

становится:

def some_method_you_wrote(options = { :option1 => 'value' })

(ответ Свананда тоже приятный)

Для кода, который вы не написали, посмотрите на методы псевдонимов. (Rails предоставляет для этой цели нечто, называемое alias_method_chain, IIRC.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...