modulos - operador modulo en ruby
¿Cómo puedo inicializar las variables de instancia de un módulo en Ruby? (5)
Aparentemente es mala forma inicializar variables de instancia en un módulo en Ruby. (Por razones que no entiendo del todo, pero relacionadas con el orden en que se crean las instancias).
Parece que la mejor práctica es usar accesadores con inicialización diferida, así:
module MyModule
def var
@var ||= 0
end
end
Luego use var
como el getter para @var
.
Tengo algunos módulos en los que me gustaría usar variables de instancia. Actualmente los estoy inicializando así:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
También podría llamar a un método init para inicializarlos:
def init
@var = 0
end
pero esto significaría que debo recordar llamarlo siempre.
¿Hay una mejor manera de hacer esto?
Inicialízalos en la definición del módulo.
module MyModule
# self here is MyModule
@species = "frog"
@color = "red polka-dotted"
@log = []
def self.log(msg)
# self here is still MyModule, so the instance variables are still available
@log << msg
end
def self.show_log
puts @log.map { |m| "A #@color #@species says #{m.inspect}" }
end
end
MyModule.log "I like cheese."
MyModule.log "There''s no mop!"
MyModule.show_log #=> A red polka-dotted frog says "I like cheese."
# A red polka-dotted frog says "There''s no mop!"
Esto establecerá las variables de instancia cuando el módulo esté definido. Recuerde, siempre puede volver a abrir el módulo para agregar más variables de instancia y definiciones de métodos, o para redefinir las existentes:
# continued from above...
module MyModule
@verb = "shouts"
def self.show_log
puts @log.map { |m| "A #@color #@species #@verb #{m.inspect}" }
end
end
MyModule.log "What''s going on?"
MyModule.show_log #=> A red polka-dotted frog shouts "I like cheese."
# A red polka-dotted frog shouts "There''s no mop!"
# A red polka-dotted frog shouts "What''s going on?"
Puedes usar:
def init(var=0)
@var = var
end
Y se establecerá en 0 por defecto si no pasa nada.
Si no desea tener que llamarlo siempre, puede usar algo como esto:
module AppConfiguration
mattr_accessor :google_api_key
self.google_api_key = "123456789"
...
end
Respondí una question similar, puedes establecer variables de instancia de clase haciendo esto
module MyModule
class << self; attr_accessor :var; end
end
MyModule.var
=> nil
MyModule.var = ''this is saved at @var''
=> "this is saved at @var"
MyModule.var
=> "this is saved at @var"
para una clase, diría lo siguiente, ya que se llama a la inicialización cada vez que usted renueve una nueva instancia de la clase.
def initialize
@var = 0
end
de Practical Ruby :
Continúa diciendo que se llamará a la inicialización de un módulo si una clase incluida inicia las llamadas super, pero no menciona que esto es una consecuencia de cómo super funciona en todas partes, no de un manejo especial para inicializar. (¿Por qué se podría suponer que initialize tiene un manejo especial? Porque tiene un manejo especial con respecto a la visibilidad. Los casos especiales crean confusión.)