zuerrong 发表于 2010-11-22 15:30

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没有复制过去。

zuerrong 发表于 2010-11-23 11:42

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

楼主这些个资料都是哪儿找的呢?还行。

zuerrong 发表于 2010-11-29 09:23

楼主这些个资料都是哪儿找的呢?还行。
2gua 发表于 2010-11-27 11:08 http://bbs.chinaunix.net/images/common/back.gif


    谢谢。。都是自己写的。这些个基础知识,无需去抄吧。

2gua 发表于 2010-11-29 13:34

谢谢。。都是自己写的。这些个基础知识,无需去抄吧。
zuerrong 发表于 2010-11-29 09:23 http://bbs.chinaunix.net/images/common/back.gif


    不错哦,可以发个给我吗?

zuerrong 发表于 2010-11-29 13:46

不错哦,可以发个给我吗?
2gua 发表于 2010-11-29 13:34 http://bbs.chinaunix.net/images/common/back.gif


    都写在chinaunix呀。。每天有空就写一篇,没专门保存哦。

2gua 发表于 2010-11-29 13:47

回复 6# zuerrong


    呃,那鼓励写个系统滴,呵呵。

gr33n 发表于 2011-11-17 03:21

鼓励有空就每天写一篇。
谢谢。

yangsf5 发表于 2012-11-20 23:37

不错啊

书还在路上,先看看祖尔的这个系列帖子……

rubyish 发表于 2013-02-06 15:20

3Q~~谢谢。。
页: [1] 2
查看完整版本: ruby扫盲之单态方法