ruby中用mixin技术来把类和module揉起来,例如
ruby 代码
- module M
- def method_defined_in_m
- end
- end
-
- class A
- include M
- end
此时,如果查看,可以发现M中的方法,已经变成了A的实例方法,可以使用以下形式调用A.new.method_defined_in_m,这是如何办到的呢?让我们来查看A的继承关系
ruby 代码
- A.ancestors
- =>["A","M","Object","Kernel"]
看到了什么?M变成了A的直接父类,ruby玩了一个魔术,当A include M的时候,ruby生成了一个M的代理,然后将此代理插入到A的继承树中作为A的直接父类,这个代理指向了实际的M,当查找代理的方法表的时候,会自动转去查找M的方法表,所以,M中的方法自然变成了A的实例方法。
现在,我们知道ruby是如何通过mixin来玩儿魔术了,但是,我们如何通过mixin来引入类方法呢?ruby提供了一种方法,叫做extend。
ruby 代码
- module M
- def method_defined_in_m
- end
- end
-
- class A
- end
-
- A.extend M
让我们来看看A的实例方法,wow,完美,method_defined_in_m已经变成了A的类方法,extend是什么?其实,extend相当于
ruby 代码
所以?是不是一清二楚了。
类似,让我们联想到上一篇blog里面写的关于实例方法和类方法的内容,如果对一个实例执行extend方法,会出现什么情况
ruby 代码
- class A
- end
-
- module M
- def method_defined_in_m
- end
- end
-
- a = A.new.extend M
-
- a.singleton_methods
- =>["method_defined_in_m"]
是不是和我们上次的分析完全吻合了
分享到:
相关推荐
JAVA抽象类和抽象方法实例分析 JAVA抽象类和抽象方法是Java面向对象程序设计中非常重要的概念,它们是Java编程语言的基础组成部分。抽象类和抽象方法可以帮助开发者更好地组织和设计程序架构,提高代码的可读性和...
华为企业架构设计方法及实例 本文档主要介绍了华为企业架构设计方法及实例,涵盖了企业架构设计方法、企业架构内容框架、业务架构、数据架构、应用架构、技术架构等方面的知识点。 一、企业架构设计方法 企业架构...
接下来,我们看第二种情况,被调用的方法没有被 `static` 修饰,这意味着它是非静态方法,与类的实例相关联。调用非静态方法时,我们需要先创建类的实例,然后通过实例来调用该方法。例如: ```java public class ...
本文是机器学习白皮书系列的第二部分,主要介绍无监督学习的方法和金融领域的应用实例。无监督学习是机器学习领域中的一种重要方法,旨在发现数据中的模式和结构,以便于对数据进行分析和预测。 无监督学习方法的...
在面向对象编程中,尤其是在Java这样的语言里,类变量(也称为静态变量)和实例变量是两个重要的概念。它们都存储了对象的状态信息,但有着本质的区别。 - **实例变量**:实例变量是在每个对象创建时为其分配内存...
在这个简单的实例中,我们将探讨如何在Android平台上实现这样的功能,不涉及复杂的特效和动画,专注于基本的UI布局和数据绑定。 首先,我们从界面设计开始。在Android中,通常使用RecyclerView来展示列表项,因为它...
这段代码展示了如何使用`loadClass()`方法加载一个类,并通过`newInstance()`创建一个无参数构造函数的实例。这里需要注意的是,如果目标类没有无参数构造函数或者该构造函数不可见,则会抛出异常。 ##### 示例二:...
在Python编程中,类的方法分为三种类型:实例方法、类方法和静态方法,它们各自有特定的使用场景和特点。 1. 实例方法 实例方法是通过实例对象调用的方法,通常第一个参数是`self`,它指向调用该方法的实例对象。...
本实验的主要任务是掌握使用类来封装对象的属性和功能,掌握类变量与实例变量,以及类方法与实例方法的区别。通过本实验,我们可以更好地理解面向对象程序设计的基本概念和技术,并掌握如何使用 Java 语言来实现面向...
本文将详细介绍实例属性和类属性的概念、使用方法和注意事项。 一、实例属性 在 Python 中,每个实例都可以有其自己的属性,这些属性称为实例属性。实例属性可以通过实例变量或 self 变量进行绑定。例如: ``` ...
这两个实例为我们提供了ArcEngine二次开发中非常实用的技术点,尤其是在图形元素的操作和数据查询方面。通过对这些实例的学习,开发者可以更好地理解ArcEngine API的使用方式,并能够将其应用到实际项目中去。此外,...
#### 二、动态加载实例类 在给定文件的代码示例中,我们看到一个名为`Refelection`的类,该类使用反射动态加载了一个名为`Student`的实例类。具体步骤如下: 1. **读取配置信息**:首先,通过`Properties`类读取...
3. **公有的静态获取实例的方法**:提供一个静态的公共方法,如`getInstance()`,用于返回Singleton类的唯一实例。首次调用时,它会创建实例;后续调用则返回第一次创建的实例。 下面是一个简单的C++ Singleton模式...
总的来说,"hibernate二级缓存实例"是一个很好的学习资源,它可以帮助我们理解二级缓存的工作机制,掌握如何在项目中配置和使用,以及注意潜在的问题和优化策略。通过实践,我们可以更好地运用这一技术,提升Java...
Java类和成员上的一些方法实例代码详解 Java类和成员上的一些方法实例代码是Java编程语言中的一些重要概念,以下是对这些方法的详细解释。 一、isInstance方法 isInstance方法是Java语言中用于判断对象是否是某个...
在C#程序设计中,实例化是至关重要的概念,它涉及到创建对象,使得我们可以与类中的数据和方法进行交互。本教程将通过一系列实例来深入理解C#的基础知识。 1. **面向对象编程**:C#是一种面向对象的编程语言,它的...
在Java编程语言中,动态地使用字符串来实例化类并调用其方法是一种高级特性,主要依赖于`java.lang.Class`类和`java.lang.reflect`包中的反射机制。这一技术在许多场景下都非常有用,例如在插件架构、动态加载类、...
本资源包“C#网络编程实例之二”包含了多个实用的网络编程示例,旨在帮助开发者深入理解和掌握这一领域。下面我们将详细探讨C#网络编程的一些核心概念和这些实例可能涉及的技术点。 首先,C#中的网络编程主要依赖于...
这本书以丰富的工程实例为引导,帮助读者理解并掌握C#在图形编程中的核心技术和实践方法。 在C#中,二维图形绘制主要依赖于GDI+(Graphics Device Interface Plus)框架。GDI+提供了丰富的绘图工具,如Pen用于定义...
1. 群猪图像实例分割:文件介绍了一种新的方法,该方法专注于在群养饲喂模式下,通过机器视觉技术实现猪只的独立识别和分割。在群猪聚集成一堆,尤其是在躺卧时,它们的身体会发生粘连,给图像分割带来挑战。传统的...