Подтвердить что ты не робот

Как указать аргумент метода по умолчанию с помощью define_method?

define_method может использоваться для определения методов:

define_method(:m) do |a|
end

что эквивалентно следующему:

def m(a)
end

Однако, какова эквивалентная форма следующего с помощью define_method:

def m(a=false)
end

Обратите внимание, что мне нужно будет позвонить m(), не указывая никаких аргументов.

4b9b3361

Ответ 1

Это фактически работает так, как вы ожидали бы в Ruby 1.9!

define_method :m do |a = false|
end

Если вам нужна совместимость с 1.8, но вам необязательно нужно закрытие для определения вашего метода, рассмотрите возможность использования class_eval со строковым аргументом и регулярным вызовом def:

class_eval <<-EVAL
  def #{"m"}(a = false)
  end
EVAL

В противном случае выполните предложение в потоке, к которому привязан philippe. Пример:

define_method :m do |*args|
  a = args.first
end

Ответ 2

В настоящее время это невозможно из-за парсера yacc. Этот поток на Ruby-форуме предлагает несколько решений.

class A
     define_method(:hello) do | name, *opt_greeting|
        option = opt_greeting.first || Hash.new
        greeting = option[:greeting] || "hello"
        puts greeting+" "+name
     end
end


a = A.new
a.hello "barbara"
a.hello "Mrs Jones", :greeting => "Good Morning"