我如何使用define_method来创build类方法?

如果您尝试以元编程方式创build类方法,这非常有用:

def self.create_methods(method_name) # To create instance methods: define_method method_name do ... end # To create class methods that refer to the args on create_methods: ??? end 

我的回答是…

我认为在Ruby 1.9中可以这样做:

 class A define_singleton_method :loudly do |message| puts message.upcase end end A.loudly "my message" # >> MY MESSAGE 

我更喜欢使用send来调用define_method,而且我也喜欢创build一个metaclass方法来访问元类:

 class Object def metaclass class << self self end end end class MyClass # Defines MyClass.my_method self.metaclass.send(:define_method, :my_method) do ... end end 

派生自: Jay和Why ,他们也提供了使这个更漂亮的方法。

 self.create_class_method(method_name) (class << self; self; end).instance_eval do define_method method_name do ... end end end 

更新 :从VR的贡献下面; 一个更简洁的方法(只要你这样定义一个方法)仍然是独立的:

 self.create_class_method(method_name) (class << self; self; end).send(:define_method, method_name) do ... end end 

但是请注意,使用send()来访问像define_method()这样的私有方法并不一定是个好主意(我的理解是它将在Ruby 1.9中消失)。

这是Ruby 1.8+中最简单的方法:

 class A class << self def method_name ... end end end 

要在Rails中使用,如果你想dynamic地定义类方法:

 module Concerns::Testable extend ActiveSupport::Concern included do singleton_class.instance_eval do define_method(:test) do puts 'test' end end end end 

你也可以做这样的事情,而不依赖于define_method:

 A.class_eval do def self.class_method_name(param) puts param end end A.class_method_name("hello") # outputs "hello" and returns nil 

这在Ruby 1.9.3中适用于我

 class B def self.class_method(param) puts param end end B.class_method("something") # outputs "something".