关闭

ruby中类方法与实例方法调用

1116人阅读 评论(0) 收藏 举报
分类:

ruby中类方法与实例方法调用



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

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

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

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

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

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

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

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

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

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

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

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

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


这里讲的比较简单,参考:http://thinkinginruby.group.iteye.com/group/wiki/1275-class-with-the-module

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

 

转自lyf blog
0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1612141次
    • 积分:15542
    • 等级:
    • 排名:第690名
    • 原创:66篇
    • 转载:956篇
    • 译文:11篇
    • 评论:27条
    最新评论