回答:
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とWhyは、この美しさを高める方法も提供しています。
self.create_class_method(method_name)
(class << self; self; end).instance_eval do
define_method method_name do
...
end
end
end
更新:以下のVRの貢献による。まだスタンドアロンであるより簡潔なメソッド(この方法で1つのメソッドのみを定義している場合):
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