ruby-on-rails – 从模块设置类变量
发布时间:2020-12-17 02:25:31 所属栏目:百科 来源:网络整理
导读:我想为我的应用程序提供单独的日志.我创建了以下模块: module MyApp module MyLog def self.included(base) base.extend(ClassMethods) end module ClassMethods def logger @@logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log") end
我想为我的应用程序提供单独的日志.我创建了以下模块:
module MyApp module MyLog def self.included(base) base.extend(ClassMethods) end module ClassMethods def logger @@logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log") end end end end 然后,在我的任何一个模型中,我可以添加: include MyApp::MyLog 并将其用作(日志文件将出现在… / log / cat.log中): Cat.logger.info 'test' 我尝试使用Cat和Dog模型中包含的这种方法,我有这样的结果: Cat.new.logger # => #<Logger:0x007fe4516cf0b0 @progname=nil,... @dev=#<File:/.../log/cat.log>,... Dog.new.logger # => #<Logger:0x007fe4516cf0b0 @progname=nil,... (the same) 如果我首先尝试将我的记录器用于Dog模型,我将有一个名为dog(/ dog.log)的日志文件. 如何使用正确的初始化记录器为每个类的模块设置类变量@@ logger? 解决方法
不要使用类变量,使用附加到类的instance_variable.
module MyApp module MyLog def self.included(base) base.extend(ClassMethods) end module ClassMethods def logger @logger ||= Logger.new("#{Rails.root}/log/#{self.name.underscore}.log") end end end end 例: module A def self.included(base) base.extend ClassMethods end module ClassMethods def logger puts @logger @logger ||= name end end end class B include A end class C include A end B.logger # B.logger # B C.logger # B.logger # B C.logger # C 第一次调用方法时它是nil,因此是空行,第二次调用方法时,值等于类名B,如果在新类上调用它再次为nil,请检查此答案 Ruby class instance variable vs. class variable (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |