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

bry*_*sai 34 ruby

define_method 可用于定义方法:

define_method(:m) do |a|
end
Run Code Online (Sandbox Code Playgroud)

这相当于以下内容:

def m(a)
end
Run Code Online (Sandbox Code Playgroud)

但是,以下使用的等效形式是什么define_method:

def m(a=false)
end
Run Code Online (Sandbox Code Playgroud)

请注意,我需要能够在m()不给出任何参数的情况下进行调用.

mol*_*olf 47

这实际上就像你在Ruby 1.9中所期望的那样!

define_method :m do |a = false|
end
Run Code Online (Sandbox Code Playgroud)

如果你需要1.8兼容性,但是你不一定需要一个闭包来定义你的方法,可以考虑使用class_eval字符串参数和常规调用def:

class_eval <<-EVAL
  def #{"m"}(a = false)
  end
EVAL
Run Code Online (Sandbox Code Playgroud)

否则请遵循philippe链接到的主题中的建议.例:

define_method :m do |*args|
  a = args.first
end
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢Ruby."我可以做X吗?","是的,X的效果就像你希望的那样!","Horray!" (9认同)

phi*_*ant 5

由于yacc解析器,目前这是不可能的. 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"
Run Code Online (Sandbox Code Playgroud)