bra*_*yne 0 ruby oop singleton design-patterns ruby-on-rails
虽然我已经将FooFactory类声明为"Singleton",但它的类变量@@ foo每次都会被实例化.为什么会这样?
主要的单身人士类:
require 'singleton'
class FooFactory
include Singleton
@@foo = nil
def get_foo
print @@foo.nil?.to_s
@@foo ||= "I am a string"
return @@foo
end
end
Run Code Online (Sandbox Code Playgroud)
控制器代码:
class PagesController < ApplicationController
def home
@foo = FooFactory.instance.get_foo
end
end
Run Code Online (Sandbox Code Playgroud)
视图代码:
<%= @foo %>
Run Code Online (Sandbox Code Playgroud)
我希望在第一次实例化之后应该返回该print方法.但每次刷新视图时,控制台都会继续打印.FooFactoryfalseFooFactorytruepages/home
在开发模式中,每次请求都会重新加载类,从而丢失可能填入其中的任何类状态.这可以通过在development.rb中查找这一行来改变:
config.cache_classes = false
Run Code Online (Sandbox Code Playgroud)
并将其更改为true,通常在production.rb中设置它.设置它的原因false是方便:您可以编辑代码并点击刷新以查看更改,而无需重新启动服务器.
但是在Rails中,将状态放入类并期望它保持在请求之间并不常见,因为虚拟机来来往往,并且线程化的VM可能无法以线程安全的方式访问类状态.这些问题有解决方法,但通常有更好的方法来做你正在做的事情.