Ruby中,特定于某一对象的方法被称为Singleton method。
例如:
a = "string"
def a.run
puts "#{self} run"
end
str.run # =>#string run
run方法是特定于a这个对象的,故run方法是a的Singleton方法。
实现上,当定义Singleton方法时,Ruby会在对象a和String类之间插入一个匿名类,或者说Singleton类。此时,a的类为Singleton类,Singleton类的超类为String类。
我们考虑到String类其实也可以看为Class类的一个实例,所以Singleton方法也可以在类的层面上定义。
例如:
class A
def self.run
puts "#{self} run"
end
end
A.run # => A run
只需要把A看做Class类的一个实例,而Singleton类插入到了A和Class类之间。
有人会发现,上面这段代码不是定义了一个类方法嘛?
yes, you got it !实际上,在Ruby中,没有所谓的“类方法”,所有的类方法都是通过Singleton类来实现的。
上面的代码也可以写为:
class A
def A.run
puts "#{self} run"
end
end
同过这个Singleton类的存在,我们可以做很多有趣的操作:
str = "string"
class << str
def run
puts "#{self} run"
end
end
这种方式定义的结果与开头代码的结果是一致的。
我们可以利用这个Singleton类进行简单的元编程:
class A
end
a = A.new
class << a
attr_accessor :attr
end
a.attr = 10
puts a.attr
在Singleton类中利用attr_accessor设定attr实例变量,这样我们相当于再程序运行时动态的改变了原有类,获得了更大的灵活性。
分享到:
相关推荐
Java常用设计模式(SingleTon、FactoryMethod、AbstractFactory)
C++完美实现Singleton模式
简单的单例模式举例Singleton 分为恶汉式 懒汉式
1、没有构造函数(DEFINE_SINGLETON_DEFAULT); 2、有构造函数,构造函数没有参数(DEFINE_SINGLETON_CONSTRUCT_NO_PARAM); 3、有构造函数,构造函数有没有参数版本(DEFINE_SINGLETON_CONSTRUCT_WITH_DEFAULT)...
Singleton模式包含的角色只有一个,就是Singleton。Singleton拥有一个私有构造函数,确保用户无法通过new直接实例化它。除此之外,该模式中包含一个静态私有成员变量instance与静态公有方法Instance()。Instance()...
单例模式 Singleton 单例模式线程安全问题和拓展
Singleton pattern单例模式应用
单例模式,Singleton两种代码实现。一般实现方法,泛型实现方法(推荐)
singleton是最常见的设计模式,但是要设计好却是不容易,尤其是多线程的时候,需要考虑线程安全的问题.
Laravel开发-singleton-pattern 帮助程序包来实现单例类。
用VC实现的singleton 模式 在VS03,VC6.0下编译通过
java singleton 不解释不解释不解释不解释
Android Singleton单例模式运用详解
singleton pattern 的定义 主要应用方法 优缺点 通过代码 具体分析解释
在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样有几个好处: 1、某些类创建比较频繁,对于一些大型的对象,这可以节省一笔很大的系统开销。 2、省去了new操作符,降低了系统内存的使用频率...
此示例展示了Qml 的单例模式(类似全局对象,只生成一次实例,可全局使用) surfsky.cnblogs.com
设计模式-Singleton与Factory
§8.3.3 Singleton 62 §8.4 Require, load和include 62 第九章 异常 64 §9.1 异常处理 64 §9.2 定义异常类 68 §9.3 catch和throw 68 第十章 多任务处理 69 §10.1 多线程处理 69 §10.1.1 线程创建 69 §10.1.2 ...
单例模式(Singleton)