免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7985 | 回复: 12
打印 上一主题 下一主题

ruby扫盲之单态方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-11-22 15:30 |只看该作者 |倒序浏览
ruby有用的特性之一是单态方法(singleton)。
某个方法如果仅属于一个特定目标,那么就称之为单态方法。

  1. s="hello"

  2. def s.hi
  3.    split(//).join("-")
  4. end
复制代码


对上述语句,s是一个字符目标,我们给它单独定义一个方法hi,hi就是singleton。
运行结果为:

> s.hi
=> "h-e-l-l-o"


类自身也是一个目标,因此类也可以有单态方法。
通常所说的类方法,其实就是类的单态方法。

  1. class Myclass
  2.    def self.hi
  3.       "hi world"
  4.    end
  5. end
复制代码


运行结果:
> Myclass.hi
=> "hi world"

当然也可以在类之外定义它:

  1. def Myclass.echo
  2.    self.inspect
  3. end
复制代码


运行结果:
> Myclass.echo
=> "Myclass"


目标可以从模块扩展方法,这些也都是单态方法。

  1. module Mymod
  2.    def fm
  3.      "m"
  4.    end
  5.    def age
  6.      20
  7.    end
  8. end

  9. guy = "kenn"
  10. 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没有复制过去。

论坛徽章:
0
2 [报告]
发表于 2010-11-23 11:42 |只看该作者
x和s是同一个目标,y和s不是同一个目标,singleton没有复制过去。


sorry 这里实际不精确。Object#clone可以复制singleton。
Object#clone与Object#dup的本质不同,后者实例化被拷贝目标的原始类(产生一个new过程),并且把实例变量指向原始目标的相同变量。
前者不执行实例化过程,而是拷贝元类(metaclass),并且设置实例变量,指向原始目标的相同变量。
所以clone可以拷贝singleton。{:3_193:}

论坛徽章:
0
3 [报告]
发表于 2010-11-27 11:08 |只看该作者
楼主这些个资料都是哪儿找的呢?还行。

论坛徽章:
0
4 [报告]
发表于 2010-11-29 09:23 |只看该作者
楼主这些个资料都是哪儿找的呢?还行。
2gua 发表于 2010-11-27 11:08



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

论坛徽章:
0
5 [报告]
发表于 2010-11-29 13:34 |只看该作者
谢谢。。都是自己写的。这些个基础知识,无需去抄吧。
zuerrong 发表于 2010-11-29 09:23



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

论坛徽章:
0
6 [报告]
发表于 2010-11-29 13:46 |只看该作者
不错哦,可以发个给我吗?
2gua 发表于 2010-11-29 13:34



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

论坛徽章:
0
7 [报告]
发表于 2010-11-29 13:47 |只看该作者
回复 6# zuerrong


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

论坛徽章:
0
8 [报告]
发表于 2011-11-17 03:21 |只看该作者
鼓励有空就每天写一篇。
谢谢。

论坛徽章:
1
天蝎座
日期:2013-08-25 10:27:22
9 [报告]
发表于 2012-11-20 23:37 |只看该作者
不错啊

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

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2013-02-06 15:20 |只看该作者
3Q~~谢谢。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP