我如何使用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".