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
, unMethod
o 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.