Как указать аргумент метода по умолчанию с помощью define_method?
define_method
может использоваться для определения методов:
define_method(:m) do |a|
end
что эквивалентно следующему:
def m(a)
end
Однако, какова эквивалентная форма следующего с помощью define_method
:
def m(a=false)
end
Обратите внимание, что мне нужно будет позвонить m()
, не указывая никаких аргументов.
Ответы
Ответ 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"