Hi all,
这个问题是我同事问我的,可惜我只知道 Singleton methods 这套模型的实现以及如何使用 Singleton methods,对于为什么 Ruby 要设计有这个功能我就完全不了解了。
大家谁能帮助我一下,谢谢。
Singleton methods 不是 Ruby 实现的模型,这个模式在面向对象编程的时候就有了,在《设计模式》里面被归类命名。
Ruby 的语法可以很容易实现 Singleton methods,要做什么看你自己了。或者你可以看看《设计模式》(Java)这本书,还有一本《Ruby 设计模式》。
我的看法,觉得怎么写好就怎么写,模仿别人的写法是捷径,我几乎不去想这是什么模式那是什么模式。
我自己几乎没写过 Singleton methods,搜了一下
http://www.rubyist.net/~slagell/ruby/singletonmethods.html
Singleton methods are often used for elements of a graphic user interface (GUI), where different actions need to be taken when different buttons are pressed.
如 @Rei 所言,Singleton 是面向对象语言的基本特性,非 Ruby 首创。Singleton 在基于原型编程(Prototype-based programming)的思路中得到了充分的应用,详见维基百科 http://zh.wikipedia.org/zh-cn/%E5%8E%9F%E5%9E%8B%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88
#18 楼 @swordray 嗯 这个可能也是理由之一 不过 Ruby 并非一门面向原型的语言。类似于
// Example of true prototypal inheritance style
// in JavaScript.
// "ex nihilo" object creation using the literal
// object notation {}.
var foo = {name: "foo", one: 1, two: 2};
// Another "ex nihilo" object.
var bar = {three: 3};
// Gecko and Webkit JavaScript engines can directly
// manipulate the internal prototype link.
// For the sake of simplicity, let us pretend
// that the following line works regardless of the
// engine used:
bar.__proto__ = foo; // foo is now the prototype of bar.
// If we try to access foo's properties from bar
// from now on, we'll succeed.
bar.one // Resolves to 1.
// The child object's properties are also accessible.
bar.three // Resolves to 3.
// Own properties shadow prototype properties
bar.name = "bar";
foo.name; // unaffected, resolves to "foo"
bar.name; // Resolves to "bar"
这样的代码在 Ruby 中无法实现。
其实,从来就没有singleton XXX
,只是叫的人多了,它才是singleton XXX
你需要直接操作实例,但是因为 Ruby 里封装
的概念,你在 Ruby 里访问a.b
的时候,其实是调用了那个方法。所以,需要引入singleton class
来直接操作实例。
另外一个是 Ruby 没有定义函数的概念。本质上设定singleton method
其实类似就是a.b = function() {}
这样一个操作。而因为 Ruby 里,你只能def
方法,而不能def
函数,同时因为上一条,所以要引入专门的语法,来完成给一个实例设置一个值为方法的属性这件事...