¿Cómo definir dinámicamente un método de clase que se refieren a una variable local fuera?
-
28-09-2019 - |
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 .
Solución
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