ruby中类方法与实例方法调用
来源:互联网 发布:淘宝卖家怎么删除首页 编辑:程序博客网 时间:2024/05/18 10:28
对此略懂, 简单解答下你的问题, 这块确实是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
- ruby中类方法与实例方法调用
- ruby中类方法与实例方法调用
- ruby的类方法与实例方法
- Ruby类方法 实例方法
- Ruby中的各种方法定义和调用(函数式方法|实例方法|类方法)
- ruby实例方法和类方法
- ruby 中的类方法和实例方法
- objective-c中类似ruby枚举类的实例方法
- Ruby中调用windows shell的方法
- Ruby中,在方法中定义类方法或实例方法的举例
- ruby方法调用
- Ruby-方法调用
- Ruby中的类和实例方法比较
- Ruby中,类方法和实例方法的一个有趣的例子
- ruby中如何调用与局部变量同名的私有方法
- ruby中类变量与实例变量
- ruby中类变量与实例变量
- ruby类方法ClassMethod&实例方法InstanceMethod小结
- MFC 通过发送消息完成按钮操作模拟鼠标单击事件的发生的问题
- 嵌入式 中断服务程序笔试题目
- 嵌入式 双向链表节点的删除的问题
- 嵌入式 ab不需要第三方进行交换值
- 监控oracle的等待事件
- ruby中类方法与实例方法调用
- 嵌入式 对于指针和数组的问题
- 嵌入式 内核态和用户态的交互
- 嵌入式 Qt主函数的书写规范问题
- 嵌入式 QTDialog界面上文本问题
- 嵌入式 Linux共享内存
- 嵌入式 子进程继承什么或未继承什么
- MFC 虚函数函数重载问题
- 嵌入式 VI分屏使用技巧