define_method
可用于定义方法:
define_method(:m) do |a|
end
等同于以下内容:
def m(a)
end
但是,使用define_method
:
def m(a=false)
end
请注意,我需要能够在不给出任何争议的情况下致电m()
。
答案 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 parser。 This 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"