objektorientiert - ruby vererbung




Wie verwende ich define_method um Klassenmethoden zu erstellen? (5)

Abgeleitet von: Jay und Why , die auch Wege bieten, dies schöner zu machen.

self.create_class_method(method_name)
  (class << self; self; end).instance_eval do
    define_method method_name do
      ...
    end
  end
end

Update : von VR Beitrag unten; eine präzisere Methode (solange Sie nur eine Methode auf diese Weise definieren), die immer noch eigenständig ist:

self.create_class_method(method_name)
  (class << self; self; end).send(:define_method, method_name) do
    ...
  end
end

Beachten Sie jedoch, dass die Verwendung von send () für den Zugriff auf private Methoden wie define_method () nicht unbedingt eine gute Idee ist (ich gehe davon aus, dass sie in Ruby 1.9 verschwindet).

Dies ist nützlich, wenn Sie versuchen, Klassenmethoden metaprogrammatisch zu erstellen:

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

Meine Antwort folgt ...


Das funktioniert bei mir in Ruby 1.9.3

class B
    def self.class_method(param)
        puts param
    end
end

B.class_method("something") # outputs "something".

Ich bevorzuge mit send, um define_method aufzurufen, und ich möchte auch eine Metaklasse-Methode erstellen, um auf die Metaklasse zuzugreifen:

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

Ich denke in Ruby 1.9 können Sie das tun:

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

A.loudly "my message"

# >> MY MESSAGE

Sie können auch so etwas tun, ohne sich auf define_method zu verlassen:

A.class_eval do
  def self.class_method_name(param)
    puts param
  end
end

A.class_method_name("hello") # outputs "hello" and returns nil




class-method