我一直在构建一个文本解析器。理想情况下,它应该是一个静态类:
keywords = Dictionary.parse(text)
但是,解析器(lib / dictionary.rb)必须将一些数据(例如,'stop_words.txt')作为数组加载到内存中。
因此,据我所知,它不能是一个静态类,因为我需要一个构造函数,它可以在使用解析器之前加载该数据。
然后:
LIB / dictionary.rb
def initialize
@stop_words = load_stop_words
end
模型/ entry.rb
def parse
@dictionary = Dictionary.new
self.keywords = @dictionary.parse(self.text)
end
但效率有多低?这是否意味着,如果我有1000个条目,Dictionary类加载'stop_words.txt'1000次,即使文件的内容几乎不变?
我想,我在这里遗漏了一些东西。必须有一个更好的解决方案 - 无需创建Dictionary类的多个实例,或者在应用程序运行时仅加载一次数据。
答案 0 :(得分:1)
所以你的模式是你想要一个对象的实例(实例化后它是有效的常量和只读),这个实例可以从许多调用者访问,但在第一次被调用时实例化它?
此模式的名称是 Singleton ,Ruby将其作为mixin提供。
答案 1 :(得分:0)
如果你在Rails中(正如我假设的那样是标签和lib目录)那么它不会被加载N次:只在Rails启动时加载lib文件(如果你更改它们,你需要重启应用程序)所以stop_words
将被加载一次。小例子(lib/timenow.rb
):
module Timenow
@now = Time.now
def self.doit
Rails.logger.warn "TIME NOW IS: #{@now}"
end
end
在任何控制器中,Timenow.doit
都会记录此模块的加载时间。
答案 2 :(得分:0)
我会使用一个初始化程序,它存储在config/initializers
中,并且只在启动时加载,并且非常适合加载配置文件或设置内容。因此,您的Dictionary
位于'/ lib and in '/config/initializers
下,您创建了一个名为dictionary.rb
的文件(或类似名称,实际上并不重要)
其中包含加载关键字的代码。