Как указать аргумент метода по умолчанию, используя define_method? - PullRequest
33 голосов
/ 12 января 2010

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

define_method(:m) do |a|
end

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

def m(a)
end

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

def m(a=false)
end

Обратите внимание, что мне нужно иметь возможность звонить m() без каких-либо аргументов.

Ответы [ 2 ]

46 голосов
/ 12 января 2010

На самом деле это работает так же, как и в Ruby 1.9!

define_method :m do |a = false|
end

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

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

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

define_method :m do |*args|
  a = args.first
end
5 голосов
/ 12 января 2010

В настоящее время это невозможно из-за парсера 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...