113

これは、クラス メソッドをメタプログラム的に作成しようとしている場合に役立ちます。

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

従うべき私の答え...

4

6 に答える 6

203

Ruby 1.9ではこれができると思います:

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

A.loudly "my message"

# >> MY MESSAGE
于 2010-11-08T17:26:00.010 に答える
25

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
于 2009-04-15T17:21:10.757 に答える
10

これは、Ruby 1.8+ での最も簡単な方法です。

class A
  class << self
    def method_name
      ...
    end
  end
end
于 2012-10-08T13:39:00.877 に答える
8

クラスメソッドを懸念から動的に定義したい場合にRailsで使用するには:

module Concerns::Testable
  extend ActiveSupport::Concern

  included do 
    singleton_class.instance_eval do
      define_method(:test) do
        puts 'test'
      end
    end
  end
end
于 2015-11-19T06:47:42.083 に答える
7

派生元: JayWhyは、これをよりきれいにする方法も提供しています。

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 で廃止されます)。

于 2009-04-15T17:06:55.317 に答える