如何使用define_method指定方法默认参数?

时间:2010-01-12 06:50:46

标签: ruby

define_method可用于定义方法:

define_method(:m) do |a|
end

等同于以下内容:

def m(a)
end

但是,使用define_method

的等效形式如下
def m(a=false)
end

请注意,我需要能够在不给出任何争议的情况下致电m()

2 个答案:

答案 0 :(得分:46)

这实际上就像你在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

答案 1 :(得分:5)

目前无法due to the yacc parserThis thread on Ruby-forum提出了几种解决方案。

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"