`

实例方法和类方法(二)

    博客分类:
  • Ruby
阅读更多
ruby中用mixin技术来把类和module揉起来,例如
ruby 代码
  1. module M   
  2.   def method_defined_in_m   
  3.   end  
  4. end  
  5.   
  6. class A   
  7.   include M   
  8. end  

此时,如果查看,可以发现M中的方法,已经变成了A的实例方法,可以使用以下形式调用A.new.method_defined_in_m,这是如何办到的呢?让我们来查看A的继承关系

ruby 代码
  1. A.ancestors   
  2. =>["A","M","Object","Kernel"]  


看到了什么?M变成了A的直接父类,ruby玩了一个魔术,当A include M的时候,ruby生成了一个M的代理,然后将此代理插入到A的继承树中作为A的直接父类,这个代理指向了实际的M,当查找代理的方法表的时候,会自动转去查找M的方法表,所以,M中的方法自然变成了A的实例方法。

现在,我们知道ruby是如何通过mixin来玩儿魔术了,但是,我们如何通过mixin来引入类方法呢?ruby提供了一种方法,叫做extend。

ruby 代码
  1. module M   
  2.   def method_defined_in_m   
  3.   end  
  4. end  
  5.   
  6. class A   
  7. end  
  8.   
  9. A.extend M  

让我们来看看A的实例方法,wow,完美,method_defined_in_m已经变成了A的类方法,extend是什么?其实,extend相当于

ruby 代码
  1. class << A   
  2.   include M   
  3. end  


所以?是不是一清二楚了。

类似,让我们联想到上一篇blog里面写的关于实例方法和类方法的内容,如果对一个实例执行extend方法,会出现什么情况

ruby 代码
  1. class A   
  2. end  
  3.   
  4. module M   
  5.   def method_defined_in_m   
  6.   end  
  7. end  
  8.   
  9. a = A.new.extend M   
  10.   
  11. a.singleton_methods   
  12. =>["method_defined_in_m"]  

是不是和我们上次的分析完全吻合了
分享到:
评论

相关推荐

    JAVA类的方法调用和变量

    JAVA类的方法调用和变量 一、类的分类: 1、普通类 2、抽象类(含有抽象方法的类) 3、静态类(不需要实例化,就可以使用的类) 二、方法的分类: 1、私有方法(只有类的内部才可以访问的方法) 2、保护方法(只有...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    实例124 使用分部类实现多种计算方法 153 实例125 使用分部类记录学生信息 155 5.5 泛型的使用 156 实例126 使用泛型存储不同类型的数据列表 156 实例127 通过泛型查找不同数组中的值 158 实例128 通过继承泛型类...

    php实例化一个类的具体方法

    第二个是动态描述,就是类里的成员方法,也就是对象的功能。 声明一个类,可以在class前加一些关键字,如abstract或final等。 声明类里的变量时,前面要加一个关键字,通常为var,还有public,private,static,等...

    Python语言面向对象概念之实例、类对象、类属性、类方法、静态方法

    定义使用三、类方法1. 概念简介2. 定义使用四、静态方法1. 概念简介2. 定义使用五、方法综合案例1. 案例需求2. 代码实现五、参考资料 一、实例 使用面向对象方式进行程序开发,首先是设计类; 其次是使用**类名()**...

    android 仿京东商品三级分类简单实例

    使用简单的方法实现类似京东商品三级分类、没有加特效和动画。

    委托实例,简单易懂

    C#委托是什么的? 在正式介绍委托之前,我想下看看生活中委托的例子——生活中,如果如果我们需要打官司,在法庭上是由律师为...C#委托中好比是律师,真真诉说案情的是当事人(真真被调用的是实例方法InstanceMethod)

    第二讲结合实例介绍硬件产品开发步骤和方法.pptx

    第二讲结合实例介绍硬件产品开发步骤和方法.pptx

    VFP编程实例及提高 PART3

    第二章介绍了VFP实训案例,在回顾结构化程序设计的基础上,详细描述了Visual FoxPro中各类基本控件的属性和根据不同目的在基本控件的事件中编写相应的代码以实现特定的功能、充分利用函数降低编程难度、数据查询方法...

    Visual C++ MFC扩展编程实例.PDF

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。全书分为三个部分和附录。第一部分介绍...

    VISUAL C MFC扩展编程实例与源码

    本书主要介绍了运用Visual C++ 5.0或6.0的高级编程技巧,内容涉及MFC程序设计的最新概念,全书提供了大量VC的编程实例,旨在帮助读者较为全面地掌握VC编程知识、技巧和方法。  全书分为三个部分和附录。第一部分...

    AUTOCAD VBA开发精彩实例教程

    全书共10章,将所有的实例归入基础相关、创建和编辑二维对象、绘图环境和对象特征、块和属性相关、创建三维对象、文件操作、参数化图形设计和数据库相关程序等大类,从不同的方面分析VBA编程的技术和技巧。...

    java范例开发大全

    实例213 二分查找法的实现方法 377 实例214 模拟操作系统的进程调度 379 实例215 利用栈将字符串逆序输出 381 实例216 动态的数组链表 382 实例217 你能猜出鱼是谁的宠物吗? 387 实例218 使用Collections类对List的...

    Java经典编程源码基础例程300.zip

    实例075 动态调用类中方法 115 实例076 动态实例化类 116 实例077 创建长度可变的数组 117 实例078 利用反射重写toString()方法 119 第8章 字符串与包装类 121 实例079 将数字格式化为货币字符串 122 实例080 货币...

    VFP编程实例及提高实战之路 PART2

    第二章介绍了VFP实训案例,在回顾结构化程序设计的基础上,详细描述了Visual FoxPro中各类基本控件的属性和根据不同目的在基本控件的事件中编写相应的代码以实现特定的功能、充分利用函数降低编程难度、数据查询方法...

    各种方法实现的VC串口通信实例源码

    MSComm 控件在基于单文档中的应用 ...多线程,多接收模式串口类 LsComm 之二 多线程,多接收模式串口类LsComm 使用Win32创建串口通讯程序 通过串口收发短消息 一个串口通讯数据库存取例子程序 杂项源代码commtest

    实例加权类依赖Relief

    Relief算法是一个过滤式特征选择算法,通过一种贪心的方式...本文提出的实例加权类依赖RELIEF (IWCDRELIEF)在多个UCI二类数据集上,与CDRELIEF进行测试比较.实验结果表明本文提出的算法相比CDRELIEF算法有明显的提高.

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

     《PHP开发实战1200例》分为I、II两卷共计1200个例子,包括了开发中各个方面最常用的实例,是目前市场上实例最全面的开发类图书;书中实例来源于多位工程师的多年积累,具有很强的实用性。 本书是第I卷,以开发...

    C#数字图像处理算法典型实例.iso

    C#数字图像处理算法典型实例共11章,分别讲述了图像的点运算、几何运算、数学形态学图像处理方法、频率变换、图像平滑与去噪、边缘检测、图像分割、图像压缩编码和彩色图像处理等相关技术。本书的光盘中附有相关章节...

    R语言朴素贝叶斯方法实现垃圾邮件的分类

    开发了针对文件按邮件的数据函数,以及手动实现了朴素贝叶斯分类方法,和最终结果的可视化。 数据中一共有6000多个邮件,其中三分之二为非垃圾邮件。 对R语言感兴趣的同学可以下载数据代码使用,数据处理部分...

Global site tag (gtag.js) - Google Analytics