class C define_method(:f1) {|name| puts "who am i: #{name}"} end C.new.f1("junmajinlong")
可以通过方法创建方法(委托给另一个方法来调用):
1 2 3 4 5 6 7 8 9
class C defcreate_method(name, &block) self.class.define_method(name, &block) end end
a = C.new a.create_method(:f1) {|name| puts "who am i: #{name}"} a.f1("junmajinlong")
可以动态定义方法:
1 2 3 4 5 6 7 8 9 10 11 12 13
a = 80 if a > 60 class C define_method(:good) {puts "good"} end else class C define_method(:bad) {puts "bad"} end end
C.new.good #C.new.bad # 将报错
如果想要访问外面的局部变量,则采用class_eval:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
class C;end
a = 80 if a > 60 C.class_eval do define_method(:good){puts "score: #{a}"} end else C.class_eval do define_method(:bad){puts "score: #{a}"} end end
C.new.good # 80 #C.new.bad # 报错
也可以使用define_method定义类方法:
1 2 3 4 5 6 7
class C class << self define_method(:f) {puts "hello"} end end
C.f
如果是通过方法委托的方式调用define_method来创建类方法,则要复杂一点。
1 2 3 4 5 6 7 8
class C defself.create_class_method(name, &block) # 方法内部的self是对象自身,而不是单例类 self.singleton_class.define_method(name, &block) end end C.create_class_method(:f) {puts "class method"} C.f