Ruby on rails 来自stdlib的Ruby singleton。如何杀死一个实例
我正在学习ruby,这就是我的情况Ruby on rails 来自stdlib的Ruby singleton。如何杀死一个实例,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在学习ruby,这就是我的情况 require 'singleton' class Lab include Singleton def initialize puts 'initializing' end end l1 = Lab.instance l2 = Lab.instance 尽管我已经做了两次Lab.instance,但我只收到一次消息“initialization”。这意味着singleton正在工作。太好了 开发模式下的Rails使用const_remo
require 'singleton'
class Lab
include Singleton
def initialize
puts 'initializing'
end
end
l1 = Lab.instance
l2 = Lab.instance
尽管我已经做了两次Lab.instance,但我只收到一次消息“initialization”。这意味着singleton正在工作。太好了
开发模式下的Rails使用const_remove杀死所有常量,以便在下一次请求时重新加载模型和控制器
我想在这里试试类似的东西。我想杀死l1和l2,这样当我执行Lab.instance时,就会创建一个新的实例,并得到消息“initialization”
有没有办法达到我的要求
谢谢这只是一个想法,但是如何实现您自己的单例模块呢
module MyLittleSingleton
def instance(*args, &block)
@instance ||= new(*args, &block)
end
def reload_instance!
@instance = nil
end
end
class Lab
extend MyLittleSingleton
end
它不会为您提供与普通Singleton相同的“安全性”,但它可能正是您所需要的。如果您需要全新的Singleton实例(例如,在测试期间使用它而不影响其他测试),您可以使用匿名子类:
Lab.instance # This writes "initializing"
MyLab = Class.new(Lab)
MyLab.instance # This writes "initializing"
MyLab.instance # This writes nothing
如果您真的想重置单例,您可以执行以下操作,但您进入了警告区,它不是公共API的一部分:
Lab.instance # This writes "initializing"
# Do it at your own risks
Singleton.__init__(Lab)
Lab.instance # This writes "initializing"
Lab.instance # This writes nothing
Singleton mix-in使用了一种非常简单的机制,您可以轻松地重新实现。如果您查看一下它的核心,就会发现它使用名为
@singleton\uuuu instance\uuuu
的实例变量进行缓存。因此,重置此变量应该可以完成这项工作。因此,如果尝试将此类方法添加到类中:
def self.reset
@singleton__instance__ = nil
end
你可以做:
l1 = Lab.instance #=> initializing
l2 = Lab.instance #=> nothing
Lab.reset
l3 = Lab.instance #=> initializing
l4 = Lab.instance #=> nothing
滚动你自己的东西总是作为最后的手段。感谢您的建议和代码示例。