rails attr_reader ruby metaprogramming

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} → proc

Define un método singleton en el receptor. El parámetro del método puede ser un Proc , un Method o un objeto UnboundMethod . 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.