当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Singleton模块用法及代码示例


本文简要介绍ruby语言中 Singleton模块 的用法。

Singleton 模块实现了 Singleton 模式。

用法

要使用 Singleton ,请将模块包含在您的类中。

class Klass
   include Singleton
   # ...
end

这确保了只能创建一个 Klass 实例。

a,b = Klass.instance, Klass.instance

a == b
# => true

Klass.new
# => NoMethodError - new is private ...

该实例是在第一次调用 Klass.instance() 时创建的。

class OtherKlass
  include Singleton
  # ...
end

ObjectSpace.each_object(OtherKlass){}
# => 0

OtherKlass.instance
ObjectSpace.each_object(OtherKlass){}
# => 1

此行为在继承和克隆下保留。

执行

以上是通过以下方式实现的:

  • 将 Klass.new 和 Klass.allocate 设为私有。

  • 覆盖 Klass.inherited(sub_klass) 和 Klass.clone() 以确保在继承和克隆时保留 Singleton 属性。

  • 提供每次调用时返回相同对象的 Klass.instance() 方法。

  • 覆盖 Klass._load(str) 以调用 Klass.instance()。

  • 覆盖 Klass#clone 和 Klass#dup 以引发 TypeErrors 以防止克隆或复制。

Singleton Marshal

默认情况下,Singleton 的 #_dump(depth) 返回空字符串。默认情况下编组将删除状态信息,例如来自实例的实例变量。使用 Singleton 的类可以提供自定义 _load(str) 和 _dump(depth) 方法来保留实例的某些先前状态。

require 'singleton'

class Example
  include Singleton
  attr_accessor :keep, :strip
  def _dump(depth)
    # this strips the @strip information from the instance
    Marshal.dump(@keep, depth)
  end

  def self._load(str)
    instance.keep = Marshal.load(str)
    instance
  end
end

a = Example.instance
a.keep = "keep this"
a.strip = "get rid of this"

stored_state = Marshal.dump(a)

a.keep = nil
a.strip = nil
b = Marshal.load(stored_state)
p a == b  #  => true
p a.keep  #  => "keep this"
p a.strip #  => nil

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Singleton模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。