如何使用 Definition_method 创建类方法?

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

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

My answer to follow...

52466 次浏览

来源于: 为什么,他们也提供了使这个更漂亮的方法。

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 ()来访问诸如 Definition _ method ()之类的私有方法并不一定是一个好主意(我的理解是,在 Ruby 1.9中它将消失)。

我更喜欢使用 send 来调用 Definition _ 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

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

class A
define_singleton_method :loudly do |message|
puts message.upcase
end
end


A.loudly "my message"


# >> MY MESSAGE

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

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

如果你想从关注点动态定义类方法,可以在 Rails 中使用:

module Concerns::Testable
extend ActiveSupport::Concern


included do
singleton_class.instance_eval do
define_method(:test) do
puts 'test'
end
end
end
end

您也可以在不依赖 Definition _ 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