`
arkxu
  • 浏览: 43216 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

在ruby里所有的东西都是实例, 包括类

阅读更多
在ruby里,每一个类都有一个Metaclass。除了Metaclass之外,所有的Object都是instance object.

换言之,在ruby里,你所有能看见的object都是实例

首先,在ruby中,如何知道一个object是一个类还是这个类的实例呢?很简单,如果有object的klass指向它,那么他就是我们传统所说的'类', 而如果一个object的klass指向别人那么就是传统所说的'实例'. 为什么要加传统呢?因为在ruby里,一个object即可以是'类',也可以是'实例'。也就是说既有一个object的klass指向它,而它的klass又指向别人。所以即使是传统意义的'类',也是metaclass的实例。而metaclass是不可见的,所以在ruby里所有的object都是一个'实例', 只有metaclass才是真正的纯'类'。这不禁让我觉得以往面向对象里所定义的'类','实例'在ruby面前被扭曲了,甚至觉得词汇定义的贫乏。

具体的关系可以看下图:


知道了这个,那么就很好理解
class T1
  @v1 = 'abc'
  def get_v1
    return @v1
  end
  
  def self.get_v1
    return @v1
  end
end

i1 = T1.new
puts i1.get_v1  #返回空,而不是'abc'
puts T1.get_v1  #这个才是返回'abc'

因为这里@v1是T1这个实例的变量,而不是ins1这个实例的变量,这是两个完全不相干的实例,如果我不追加定义self.get_v1的话T1里根本就没有get_v1这个方法,所以你调用T1.get_v1是错误的。
  • 大小: 50.9 KB
分享到:
评论
3 楼 sgelove 2011-11-05  
忘了说明了,实例变量只能定义在实例方法内部。
2 楼 sgelove 2011-11-05  
class T1
  @v1 = "#{self.class.name} | i'm v1."
  
  def get_v1
     @v1 = "#{self.class.name} | i'm v2."
    return @v1
  end
  
  def self.get_v1
    return @v1
  end
  
end

puts T1.get_v1 # T1本身是Class类的一个实例,并且@v1已经赋值过了,调用本省的方法是可以返回值的。 返回值:Class | i'm v1.
t1 = T1.new
puts t1.get_v1 # t1是T1的一个实例,但是@v1没有赋值,所以调用t1内的get_v1返回的是T1 | i'm v2.



具体没有你理解的那么深,不过通过这个例子应该能说明一些内容。多谢指点,呵呵。。
1 楼 xiuxiuxiu 2008-08-11  
佩服佩服!!

相关推荐

    ruby 中文文档 必备资料

    它具有类和对象的概念,所有的东西都是对象,包括基本的数据类型。类定义了对象的属性和行为,而对象则是类的实例。Ruby还支持继承、多态和模块,使得代码可以高度模块化和可复用。 在函数和方法方面,Ruby允许...

    .一步一步学RUBY

    - **一切皆对象**:在Ruby中,从基本数据类型到布尔值,乃至`nil`,所有东西都被视为对象。方法调用参数也是可选的,这体现了Ruby的灵活性和面向对象的哲学。 - **语句块与迭代器**:Ruby支持简洁的循环语法,如`...

    Ruby从入门到精通pdf

    - 类与对象:Ruby是一门纯面向对象的语言,所有的东西都是对象,类是用来创建对象的模板。 - 继承:Ruby支持单继承,但通过模块可以实现多重继承的效果。 - 属性与方法:通过attr_accessor、attr_reader和attr_...

    Ruby 语言中类与对象简介,入门级语法介绍

    在Ruby中,由于所有东西都是对象,因此可以通过方法调用来实现多态。例如,`+`操作符可以用于整数相加,也可以用于字符串拼接。 #### 二、类的定义 在Ruby中,类是用来定义具有相同属性和行为的对象的模板。类的...

    Ruby语言中文教程

    Ruby是一种纯面向对象的语言,意味着所有的东西都是对象,包括基本数据类型。每种对象都有自己的类,如整数属于Integer类,字符串属于String类。对象可以有方法,通过`.`操作符调用。Ruby中的类还可以继承,通过`...

    Ruby程序设计.doc

    元类是定义类本身的类,在Ruby中,每个类都有一个元类,通过元类可以修改类的行为。 **3.7 Ruby的动态性** Ruby支持动态方法定义、方法重写等特性,使得程序能够在运行时动态地改变其行为。 **3.8 变量** - **...

    Ruby教程

    Ruby是一种完全的面向对象语言,这意味着所有的东西都是对象,包括基本的数据类型如数字、字符串和布尔值。它支持类、继承、模块、多重继承等面向对象特性,同时引入了块、闭包和 Proc 对象,使得函数式编程风格也能...

    编程资源:Ruby 编程的简要介绍.docx

    1. **面向对象**: Ruby是一种纯粹的面向对象语言,几乎所有的东西都被视为对象,包括基本数据类型如整数和字符串。 2. **动态性**: Ruby是一种动态类型语言,这意味着变量不需要预先声明类型,且类型检查是在运行时...

    ruby语法基础教程.pdf

    - 在Ruby中,每个类都有一个隐式的元类。 **3.8 变量** - **局部变量:** 在方法或代码块中定义,作用域仅限于定义它的代码块或方法。 - **实例变量:** 以`@`开头,作用于类的每个实例。 - **类变量:** 以`@@`...

    ruby-2.5.1

    所有的东西都是对象,包括基本类型如数字、字符串和布尔值。类定义了对象的结构和行为,而对象则是类的实例。Ruby的面向对象特性使得代码易于理解且可复用性强。另外,Ruby的模块(Module)提供了命名空间管理和混合...

    Ruby语言入门教程

    - **实例变量与类变量**:实例变量在每个对象实例中都有独立的副本,而类变量在所有实例间共享。 - **单例方法**:单例方法是为特定对象定义的方法,只能被该对象调用。 - **访问控制**:Ruby提供了访问控制机制,...

    Ruby 语言教程从小白到入门

    在Ruby中,一切都是对象,包括基本的数据类型如数字、字符串和布尔值。理解这一点至关重要,因为这意味着你可以对任何东西调用方法,这极大地增强了代码的灵活性和可扩展性。 Ruby的语法简洁明了,它采用了自解释的...

    Programming-Ruby-1.9.pdf

    - **面向对象特性**: Ruby是一门纯面向对象的语言,所有东西都是对象,包括数字和字符串。 - **数组和哈希**: 数组用于存储一系列有序的数据,而哈希则通过键值对的方式存储数据。 - **符号**: 符号是不可变的字符串...

    why.s.poignant.guide.to.ruby.pdf en

    - **类与对象**:Ruby是一种完全面向对象的语言,所有东西都是对象,包括数字和字符串等基本数据类型。类是创建对象的模板。 - **继承与多态**:子类可以继承父类的属性和方法,并且可以覆盖或扩展它们的功能。多态...

Global site tag (gtag.js) - Google Analytics