ruby扫盲之单态方法
ruby有用的特性之一是单态方法(singleton)。某个方法如果仅属于一个特定目标,那么就称之为单态方法。
s="hello"
def s.hi
split(//).join("-")
end
对上述语句,s是一个字符目标,我们给它单独定义一个方法hi,hi就是singleton。
运行结果为:
> s.hi
=> "h-e-l-l-o"
类自身也是一个目标,因此类也可以有单态方法。
通常所说的类方法,其实就是类的单态方法。
class Myclass
def self.hi
"hi world"
end
end
运行结果:
> Myclass.hi
=> "hi world"
当然也可以在类之外定义它:
def Myclass.echo
self.inspect
end
运行结果:
> Myclass.echo
=> "Myclass"
目标可以从模块扩展方法,这些也都是单态方法。
module Mymod
def fm
"m"
end
def age
20
end
end
guy = "kenn"
guy.extend Mymod
运行结果:
> guy.fm
=> "m"
> guy.age
=> 20
单态方法始终属于目标,而不是引用目标的变量。
只要目标不变,方法就存在。
另外singleton不可复制。
irb(main):025:0> s = "hello"
=> "hello"
irb(main):026:0> def s.hi
irb(main):027:1> "hi world"
irb(main):028:1> end
=> nil
irb(main):029:0> x=s
=> "hello"
irb(main):030:0> x.hi
=> "hi world"
irb(main):031:0> y=s.dup
=> "hello"
irb(main):032:0> y.hi
NoMethodError: undefined method `hi' for "hello":String
from (irb):32
from :0
irb(main):034:0> x.object_id == s.object_id
=> true
irb(main):035:0> y.object_id == s.object_id
=> false
x和s是同一个目标,y和s不是同一个目标,singleton没有复制过去。 x和s是同一个目标,y和s不是同一个目标,singleton没有复制过去。
sorry 这里实际不精确。Object#clone可以复制singleton。
Object#clone与Object#dup的本质不同,后者实例化被拷贝目标的原始类(产生一个new过程),并且把实例变量指向原始目标的相同变量。
前者不执行实例化过程,而是拷贝元类(metaclass),并且设置实例变量,指向原始目标的相同变量。
所以clone可以拷贝singleton。{:3_193:} 楼主这些个资料都是哪儿找的呢?还行。 楼主这些个资料都是哪儿找的呢?还行。
2gua 发表于 2010-11-27 11:08 http://bbs.chinaunix.net/images/common/back.gif
谢谢。。都是自己写的。这些个基础知识,无需去抄吧。 谢谢。。都是自己写的。这些个基础知识,无需去抄吧。
zuerrong 发表于 2010-11-29 09:23 http://bbs.chinaunix.net/images/common/back.gif
不错哦,可以发个给我吗? 不错哦,可以发个给我吗?
2gua 发表于 2010-11-29 13:34 http://bbs.chinaunix.net/images/common/back.gif
都写在chinaunix呀。。每天有空就写一篇,没专门保存哦。 回复 6# zuerrong
呃,那鼓励写个系统滴,呵呵。 鼓励有空就每天写一篇。
谢谢。 不错啊
书还在路上,先看看祖尔的这个系列帖子…… 3Q~~谢谢。。
页:
[1]
2