`
ruby_windy
  • 浏览: 60841 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于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

如有不懂也可站内留言.
  • 大小: 26.1 KB
1
2
分享到:
评论

相关推荐

    实例讲解Ruby中的钩子方法及对方法调用添加钩子

    Class#inherited方法也是这样一个钩子方法,当一个类被继承时,Ruby会调用该方法。默认情况下,Class#inherited什么都不做,但是通过继承,我们可以拦截该事件,对感兴趣的继承事件作出回应。 class String def ...

    ice同步调用和异步调用实例代码

    Ice 是一种针对客户端和服务器进行通信的面向对象的中间件平台。Ice 为构建面向对象的客户-服务器应用提供了工具、API 和库支持。客户和服务器通信双方可以用不同的编程...本代码为ice同步调用和异步调用实例代码。

    RubySharp:用 C# 编写的 Ruby 解释器。 工作正在进行中

    Ruby 中的类和实例方法 在 Ruby 中创建自己的 attr_accessor 什么是存取器? 在 ruby​​ 中定义全局方法的方法 Ruby:为什么 puts 调用 to_ary? "puts" 在 Ruby 中是如何工作的 Ruby 中的祖先是什么,它们的...

    ruby对excel的操作 详细操作

    ruby对excel的操作 详细描述ruby对excel的操作

    Ruby菜鸟入门指南.md

    5. Ruby中"一切皆方法调用",没有直接访问属性的方式,只有方法调用。 6. 变量命名约定,如局部变量、常量、实例变量、类变量等。 7. 方法命名约定,如?结尾表示返回布尔值,!结尾表示会修改对象。 8. 块(Block)的...

    Ruby简明教程之方法(Method)介绍

    当创建一个实例时,则需要调用类方法。 代码如下: a = Array.new #创建一个新数组 File.rename(oldname, newname) #更改文件名 调用类方法时,可以使用”.”,也可以使用”::” 3. 函数方法:直接省略调用者的...

    Ruby基础知识之方法、代码段

    Ruby中的方法是一个有名称的代码块,是...在类中定义的方法为实例方法,实例方法可以在类的实例对象上使用。如果是在一个特定的对象上定义方法,那么此方法就是一个单键方法,只能在这个对象上使用。 代码如下: class

    实例解析Ruby程序中调用REXML来解析XML格式数据的用法

    主要介绍了Ruby程序中调用REXML来解析XML格式数据的用法,文中用实例分三个步骤讲解了REXML解析XML的过程,需要的朋友可以参考下

    ruby语法基础教程

    §3.5 类变量与类方法 23 §3.4 存取控制 23 §3.6 元类 25 §3.7 Ruby的动态性 26 §3.8 变量 26 §3.8.1 局部变量 27 §3.8.2 实例变量 27 §3.8.3 类变量 27 §3.8.4 全局变量 28 §3.8.5 常量 28 §3.8 与定义...

    Ruby基础知识之类

    当通过new方法实例化一个类对象后,会自动调用initialize方法,把new中的参数传递给initialize方法进行初始化。在c#中的域,在ruby中称为实例变量,定义时前边加@前缀,表示是一个实例变量。 代码如下: class ...

    优化Ruby脚本效率实例分享

    profile.rb是为Ruby程序准备的profiler,它...第2种则是从整体时间中扣除在该方法中调用其它方法所耗费时间之后得到的时间,称为实际时间。输出信息每行中各字段含义如下(从左到右): 该方法执行时间占整体时间的百

    ruby-oo-self-count-sentences-lab

    概述在本实验中,您将向Ruby的String类添加一些实例方法。 我们通常希望避免更改内置类(特别是如果我们与其他人一起工作),但是在这种情况下,我们不会覆盖任何方法,这在OO编程中是一个很好的练习。 向Ruby的内置...

    ruby oo自我计数句子实验室sfo01-seng-ft-071320

    在本实验中,您将向Ruby的String类添加一些实例方法。 我们通常希望避免更改内置类(尤其是在与其他人一起工作的情况下),但是在这种情况下,我们不会覆盖任何方法,这在OO编程中是一个很好的练习。 在Ruby的内置类...

    Ruby高级方法实验室v-000

    Ruby高级类方法实验室学习目标构建自定义类的构造函数。... 印刷约定:我们在实例上调用的方法以#method_name表示,而在类上调用的方法以#method_name表示. 所以Math.sin将引用类方法sin (除以相反在从三角相邻的),

    设计模式中的观察者模式在Ruby编程中的运用实例解析

    体现成类之间的直接调用,否则就将使观察者和被观察对象之间紧密的耦合起来, 从根本上违反面向对象的设计的原则。无论是观察者“观察”观察对象, 还是被观察者将自己的改变“通知”观察者,都不应该直接调用。 ...

    Ruby中的反射(Reflection)应用实例

    在Java语言中,提供了发射机制,通过发射机制可以通过字符串构造出这个对象,可以获取对象的所有方法(包括私有方法),可以调用私有方法,可以更改成员变量的值(包括私有的成员变量)。Ruby也是面向对象的高级语言...

    初步讲解Ruby编程中的多线程

    Ruby 中我们可以通过 Thread 类来创建多线程,Ruby的线程是一个轻量级的,可以以高效的方式来实现并行的代码。 创建 Ruby 线程 要启动一个新的线程,只需要调用 Thread.new 即可: # 线程 #1 代码部分 Thread.new {...

Global site tag (gtag.js) - Google Analytics