引用
对此略懂, 简单解答下你的问题, 这块确实是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
分享到:
相关推荐
在Ruby中,方法和类是构建程序的基本元素,它们是实现代码重用和组织的关键概念。 ### 方法(Methods) 方法在Ruby中是可重复使用的代码块,它们接受参数,执行特定任务,并可能返回值。方法定义使用`def`关键字...
1. 变量:Ruby中的变量分为五种类型:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)、全局变量(以`$`开头)和常量(以大写字母开头)。每种变量都有其作用域和使用场景。 2. ...
在Ruby中,多态主要体现在方法调用上,因为所有对象都是Object类的子类。例如,可以为不同的类定义相同的方法名,它们会根据对象的类型执行不同的操作。 ```ruby class Animal def speak raise "Abstract method...
变量在Ruby中有四种类型:局部变量、实例变量、类变量和全局变量,它们都有特定的标识符前缀。数据类型包括基本类型和复杂类型,如数组、哈希(字典)、集合等。 函数和方法是Ruby的核心组成部分。你可以定义自己的...
在Ruby语言中,类实例变量、类实例方法与类变量和类方法是构成面向对象编程模型的重要组成部分。它们各自有不同的用途和行为特性,下面详细介绍这些概念的区别以及它们的使用场景。 首先,类实例变量和类实例方法都...
Class#inherited方法也是这样一个钩子方法,当一个类被继承时,Ruby会调用该方法。默认情况下,Class#inherited什么都不做,但是通过继承,我们可以拦截该事件,对感兴趣的继承事件作出回应。 class String def ...
在这个例子中,`Person`类定义了一个`initialize`方法,这是一个特殊的构造方法,当创建类的新实例时会被自动调用。 #### 三、对象的创建 对象是类的实例,通过调用类的`new`方法来创建。 ```ruby person = ...
- 函数与方法:Ruby中的函数被称为方法,可以定义在类或模块中,支持块(block)和 Proc 对象。 2. **面向对象编程(OOP)** - 类与对象:Ruby是纯面向对象的语言,一切皆对象。你可以创建自定义类来封装数据和...
在传统的面向对象编程中,我们通常会定义类和实例方法来封装逻辑,而在函数式编程中,我们倾向于将函数作为一等公民,这意味着它们可以被赋值给变量、作为参数传递,也可以作为其他函数的返回值。 在Ruby中,Functo...
Ruby中的装饰器模式是一种设计模式,它允许我们动态地向对象添加新的行为或职责,而无需修改原有类的代码。这种模式比继承更加灵活,因为它可以在运行时改变对象的行为,而不是在编译时通过类继承来实现。装饰器模式...
变量在Ruby中有四种类型:局部变量(以小写字母或下划线开头)、实例变量(以`@`开头)、类变量(以`@@`开头)和全局变量(以`$`开头)。数据类型包括字符串、数字、布尔值、数组、哈希等。控制结构包括条件语句(如...
例如,在类`Car`中`include Base`后,`Base`模块中的所有实例方法(如`show`)都可以通过`Car`的实例调用,如`Car.new.show`。 而`extend`则不同,它将模块中的方法添加为类的类方法。这意味着当你在类定义中使用`...
描述中的“Ruby - language - ITeye论坛”表明这是一个关于Ruby编程语言的讨论,具体涉及如何在ITeye论坛上分享的关于Ruby调用ICE接口的方法。 首先,要了解ICE的基本概念。ICE提供了一种类型安全、面向对象的RPC...
### Ruby收取邮件实例详解 在IT领域,使用编程语言处理电子邮件是常见的需求之一,而Ruby作为一门优雅且功能丰富的脚本语言,在这方面提供了强大的支持。本文将深入解析一个Ruby脚本,该脚本用于通过POP3协议收取...
1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以动态创建方法,而`send`或`__send__`则用于在运行时调用方法。 2. **类与模块操作**:Ruby的`Class.new`和`Module.new`可以用来...
这得益于Ruby的反射API和`send`方法,可以动态地调用方法、添加和删除方法、修改类的结构等。 7. **标准库和Gem**:Ruby的标准库提供了大量的内置模块和类,覆盖了网络、文件系统操作、日期时间处理等常见任务。...
### Ruby面向对象编程中类的方法与类的扩展 在Ruby这门动态的、面向对象的脚本语言中,类和方法扮演着极其重要的角色。本文将深入探讨Ruby中类的方法以及类的扩展,并通过示例代码帮助理解这些概念。 #### 类方法 ...
在Ruby编程语言中,钩子方法(Hook Methods)是一类特殊的方法,它们允许开发者在特定事件发生时执行自定义代码。这些事件通常涉及到类、模块或对象的生命周期,例如类的继承、模块的包含、方法的添加或删除等。钩子...
2. **调用方式**:`include`的方法通过类的实例调用,`extend`的方法直接通过类调用。 3. **继承**:使用`include`的模块方法可以被子类继承,而`extend`通常不推荐用于继承,因为它主要关注于类级别的行为。 #### ...
Ruby元编程是Ruby编程语言中的一个重要特色,它指的是Ruby语言允许程序员在运行时对类、方法和变量等进行操作的能力。通过元编程,开发者可以编写出更加简洁、灵活和高效的代码。《Metaprogramming Ruby》这本书深入...