Ruby on rails 来自stdlib的Ruby singleton。如何杀死一个实例

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

我正在学习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_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

滚动你自己的东西总是作为最后的手段。感谢您的建议和代码示例。