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)
由于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)