Pregunta

class C
end

var = "I am a local var outside"

C.class_eval do
   def self.a_class_method
     puts var 
   end
end

Lo sé, esto no es correcto, porque el def creado un nuevo ámbito. También sé que el uso define_method puede crear un método de instancia sin crear un nuevo ámbito, pero mi punto es cómo definir un método class .

¿Fue útil?

Solución

realmente no existen métodos

y calidad en Ruby, que son sólo Singleton métodos de la clase de objeto. Singleton no existen realmente métodos, o bien, son los métodos de instancia simplemente ordinarias, Clase Singleton del objeto.

Como usted ya sabe cómo definir los métodos de instancia (utilizando Module#define_method), que ya sabe todo lo que necesita saber. Sólo tiene que class_eval llamada en la clase Singleton C en lugar de C sí:

(class << C; self end).class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

Las versiones actuales de Ruby tienen un método singleton_class para hacer más fácil que:

C.singleton_class.class_eval do
  define_method(:a_class_method) do
    puts var 
  end
end

Pero, en realidad, las versiones actuales de Rubí también han Module#define_singleton_method, por lo que, en este caso particular, que no es necesaria:

C.define_singleton_method(:a_class_method) do
  puts var 
end

Otros consejos

Puede hacerlo simplemente esta manera

class << C
  define_method(:a_class_method) do
     # do something
  end
end
C.instance_eval do
  def class_method
    "This is class method"
  end
end

instance_eval :. Define únicos métodos en el objeto (que se traduce en métodos de clase cuando se llama en objeto de clase)

class_eval : define regular de los métodos de instancia

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top