本文简要介绍ruby语言中 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 SingleForwardable模块用法及代码示例
- Ruby SingleLine.new用法及代码示例
- Ruby SingleForwardable.def_single_delegators用法及代码示例
- Ruby SizedQueue clear()用法及代码示例
- Ruby SizedQueue push()用法及代码示例
- Ruby SimpleDelegator.__setobj__用法及代码示例
- Ruby SizedQueue shift()用法及代码示例
- Ruby Signal.trap用法及代码示例
- Ruby SizedQueue enq()用法及代码示例
- Ruby SizedQueue max()用法及代码示例
- Ruby SizedQueue empty?用法及代码示例
- Ruby SimpleDelegator类用法及代码示例
- Ruby SizedQueue pop()用法及代码示例
- Ruby SizedQueue new()用法及代码示例
- Ruby SizedQueue length()用法及代码示例
- Ruby SignalException类用法及代码示例
- Ruby SizedQueue deq()用法及代码示例
- Ruby Signal.list用法及代码示例
- Ruby SizedQueue close()用法及代码示例
- Ruby Signal模块用法及代码示例
- Ruby Signal.signame用法及代码示例
- Ruby SizedQueue size()用法及代码示例
- Ruby SizedQueue max=用法及代码示例
- Ruby Symbol capitalize用法及代码示例
- Ruby Spotter.spot_op_asgn2_for_name用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Singleton模块。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。