我有一些模块要在其中使用实例变量。目前,我正在像这样初始化它们:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
我也可以调用一个init方法来初始化它们:
def init
@var = 0
end
但这意味着我必须记住始终调用它。
有更好的方法吗?
我有一些模块要在其中使用实例变量。目前,我正在像这样初始化它们:
module MyModule
def self.method_a(param)
@var ||= 0
# other logic goes here
end
end
我也可以调用一个init方法来初始化它们:
def init
@var = 0
end
但这意味着我必须记住始终调用它。
有更好的方法吗?
Answers:
在模块定义中初始化它们。
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!"
定义模块时,这将设置实例变量。请记住,您可以稍后alwasys重新打开模块以添加更多实例变量和方法定义,或重新定义现有的变量和方法定义:
# 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?"
对于一个类,我会说以下内容,因为每当您.new一个新的类实例时,都会调用initialize。
def initialize
@var = 0
end
来自实用Ruby:
继续说,如果包含类的initialize调用super,则将调用模块的initialize,但没有提及这是super在任何地方都起作用的结果,而不是对initialize的特殊处理。(为什么要假设初始化会受到特殊处理?因为它在可见性方面受到特殊处理。特殊情况会造成混淆。)