ruby - attr_reader - Cómo usar define_method en initialize()
attr_reader in ruby (2)
Intentando utilizar define_method dentro de initialize pero obteniendo undefined_method define_method . ¿Qué estoy haciendo mal?
class C
def initialize(n)
define_method ("#{n}") { puts "some method #{n}" }
end
end
C.new("abc") #=> NoMethodError: undefined method `define_method'' for #<C:0x2efae80>
Haz lo siguiente:
class C
def initialize(n)
self.class.send(:define_method,n) { puts "some method #{n}" }
end
end
ob = C.new("abc")
ob.abc
# >> some method abc
Module#define_method es un método privado y también un método de clase. Tu no funcionó, ya que intentaste llamarlo en la instancia de C #send llamarlo en C , usando #send en tu caso.
Sospecho que estás buscando define_singleton_method :
define_singleton_method (símbolo, método) → new_method
define_singleton_method (símbolo) {bloque} → procDefine un método singleton en el receptor. El parámetro del método puede ser un
Proc, unMethodo un objetoUnboundMethod. Si se especifica un bloque, se utiliza como cuerpo del método.
Si usa define_method en self.class , creará el nuevo método como un método de instancia en toda la clase para que esté disponible como un método en todas las instancias de la clase.
define_singleton_method esta manera:
class C
def initialize(s)
define_singleton_method(s) { puts "some method #{s}" }
end
end
Y entonces:
a = C.new(''a'')
b = C.new(''b'')
a.a # puts ''some method a''
a.b # NoMethodError
b.a # NoMethodError
b.b # puts ''some method b''
Si su initialize hizo:
self.class.send(:define_method,n) { puts "some method #{n}" }
entonces obtendrías:
a.a # puts ''some method a''
a.b # puts ''some method b''
b.a # puts ''some method a''
b.b # puts ''some method b''
y eso probablemente no es lo que estás buscando. Crear una nueva instancia y hacer que toda la clase cambie como resultado es bastante extraño.