Answers:
我更喜欢使用send来调用define_method,并且我还喜欢创建一个元类方法来访问该元类:
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
metaclass
,因此知道简单易行的速记法也很好。
这是Ruby 1.8+中最简单的方法:
class A
class << self
def method_name
...
end
end
end
派生自:Jay and 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中它已不复存在)。
如果要根据关注动态定义类方法,可以在Rails中使用:
module Concerns::Testable
extend ActiveSupport::Concern
included do
singleton_class.instance_eval do
define_method(:test) do
puts 'test'
end
end
end
end
singleton_class.define_method