Ich habe einige Module, in denen ich Instanzvariablen verwenden möchte. Ich initialisiere sie derzeit wie folgt:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
Ich könnte auch eine init-Methode aufrufen, um sie zu initialisieren:
def init
@var = 0
end
aber das würde bedeuten, dass ich daran denken muss, es immer zu nennen.
Gibt es einen besseren Weg, dies zu tun?
Antworten:
Initialisieren Sie sie in der Moduldefinition.
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!"
Dadurch werden die Instanzvariablen festgelegt, wenn das Modul definiert wird. Denken Sie daran, dass Sie das Modul jederzeit wieder öffnen können, um weitere Instanzvariablen und Methodendefinitionen hinzuzufügen oder vorhandene neu zu definieren:
# 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?"
quelle
Sie können verwenden:
def init(var=0) @var = var end
Und es wird standardmäßig 0 sein, wenn Sie nichts übergeben.
Wenn Sie es nicht jedes Mal aufrufen müssen möchten, können Sie Folgendes verwenden:
module AppConfiguration mattr_accessor :google_api_key self.google_api_key = "123456789" ... end
quelle
Für eine Klasse würde ich Folgendes sagen, da die Initialisierung immer dann aufgerufen wird, wenn Sie eine neue Instanz der Klasse erstellen.
def initialize @var = 0 end
von Practical Ruby :
quelle
i beantwortet eine ähnliche Frage , die Sie festlegen können Variablen Klasseninstanz dies zu tun
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"
quelle
Anscheinend ist es eine schlechte Form, Instanzvariablen in einem Modul in Ruby zu initialisieren. (Aus Gründen, die ich nicht vollständig verstehe, die sich jedoch auf die Reihenfolge beziehen, in der die Dinge instanziiert werden.)
Es scheint, dass die beste Vorgehensweise darin besteht, Accessoren mit verzögerter Initialisierung zu verwenden, wie folgt:
module MyModule def var @var ||= 0 end end
Dann
var
als Getter für verwenden@var
.quelle
nil
oderfalse