免费注册 查看新帖 |

Chinaunix

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

关于Ruby中类方法与实例方法调用的理解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-17 10:50 |只看该作者 |倒序浏览
关于Ruby中类方法与实例方法调用的理解







引用







对此略懂, 简单解答下你的问题, 这块确实是ruby深入理解的关键点.

首先,要明白一点: Ruby一切皆对象.

什么意思呢? Ruby一个类也是一个对象(使用XX.class知道它的类是Class),它也具备方法(即所谓的类方法). 这个可以称之谓元类(MetaClass)

而Ruby中调用方法逻辑很简单:
1. 查询该对象所属类中的所有方法,如果存在调用之,如果不存在则调用父类的方法.
2. 如果回溯到顶级类,还不存在则调用method_missing, 默认抛出NoMethodError异常.

那分析下该输出
  1. i1 = T1.new

  2. puts "i1.get_v1: #{i1.get_v1}" #输出 bbb in init  ##i1属于类T1的实例,调用T1的方法get_v1,得到结果.

  3. puts "T1.get_v1: #{T1.get_v1}" #输出 ! aaa ! ##这里调用T1的元类,即所写的self.get_v1, 得到 ! aaa !

  4. puts "i1.v1: #{i1.v1}" #输出 bbb in init ##与第一个一致, 值得一提,attr_xx 系列方法是一个魔法,是Module中提供的方法,用在这里生成新的方法.

  5. puts "i1.get2: #{i1.get2}" #输出   ! @@ v2 ! ##这个类变量输出,通过实例取得类变量的值.

  6. puts "i1.get3: #{i1.get3}" #输出 @@ v3 in init ##同上

  7. puts "i1.v3: #{i1.v3}" #输出 这里是空的 ## 未赋值,当然是空的. 记住在方法中self指向类,而在类中self指向元类.所以在类中使用@var赋值,这个变量属于元类而不是你期望的类.

  8. puts "i1.vtest: #{i1.vtest}" #输出 vtest ## 这个同之前的分析

  9. #puts "T1.vtest: #{T1.vtest}" 报错  ##元类不存在该方法,当然报错,你可以使用 class <<self
  10. #attr_reader :vtest
  11. #end
复制代码
来打开元类的该方法,当然再赋个值,要不是空值.


这里讲的比较简单,参考: http://thinkinginruby.group.itey ... ass-with-the-module

更可以搜索Google: 关键字 Ruby MetaClass

如有不懂也可站内留言.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP