`
liano
  • 浏览: 25867 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

对 ruby 中的class 理解

阅读更多
ruby 中所有的东西都是对象,包括一些基础的Object,Class, Module。
可以把ruby中的类和实例都统一的理解为实例。像Class这样的特殊的实例,因为有new方法,所以可以产
生新的实例。

既然所有的东西都是实例,那对于新实例的产生和新类的产生是如何工作的?
instance中的方法和变量分为2部分,一部分叫object 方法,一部分叫instance 方法, 变量也一样。
所以,当用new产生新的实例的时候,mother instance 中的instance methods 被用链接的方式copy到child instance 中, 作为child instance 的 object 方法存在. 也就是说,对于每一个instance, 其中>的object method是给自己用的,instance method 是给用new生出来的孩子用的。

当用继承的方式产生一个新的instance的时候,mother instance 的所有method 都被链接copy到新的instance中去。

所以,以这个理解为基础,
Object.instance_eval 添加的是object method
Object.extend_object 添加的是object method
Module.class_eval 添加的是instance method
Module.define_method 添加的是instance method


所以 用class 关键字声明一个类的时候,实际上就是产生一个类的实例,和用Class.new的效果是一样的。
都说自己定义的Module没有new方法,那是因为自己在定义module的时候没有添加new方法,对于ruby内置的Module, 是有new方法的,所以在生成一个新的module的时候,也可以用Module.new的方式。

Object,Module,Class的mother instance 都是Class, 然而Class又继承于Mudle,Module继承于Object, 如果是静态语言的话,这样的循环会有编译的问题,因为,哪一个都不能被先编译。

但是对于动态语言,我可以先执行Class的定义,然后执行Object和Module的继承,最后再从新扩展Class,让它继承Module。 说白了,这些操作就是对object内部的函数表和变量表进行操作,所以没有问题。


最后,贴点代码:

MyModule = Module.new
MyModule.class_eval(%q{
  def hello()
    puts "hello"
  end
 
  def self.cry()
    puts "self.cry"
  end
})

MyModule.cry
MyModule.instance_eval %Q{
  def cry()
    puts "self.cry by instance_eval"
  end
}
MyModule.cry

MyModule.send(:define_method, :shout)  do |words|
  puts "MyModule is shouting!"
end

puts MyModule.methods.size
puts MyModule.instance_methods.size
puts MyModule.singleton_methods.size



puts "=" * 30

MyClass = Class.new
MyClass.send(:include, MyModule)

MyClass.new.hello

MyClass.new.shout "abc"

MyClass.class_eval %Q{
  def self.cry()
    puts "self.cry by MyClass.class_eval"
  end
}

MyClass.cry

# to prove instance methods is copied from mother object to child object.
my_class = MyClass.new
puts MyClass.instance_methods.size

MyClass.class_eval %Q{
  def cry()
    puts "self.cry by MyClass.class_eval"
  end
}

puts my_class.methods.size
puts MyClass.instance_methods.size
puts MyClass.methods.size

运行结果:

RubyMate r8136 running Ruby r1.8.6 (/usr/local/bin/ruby)
>>> my_module.rb

self.cry
self.cry by instance_eval
74
2
1
==============================
hello
MyModule is shouting!
self.cry by MyClass.class_eval
44
45
45
77
分享到:
评论
1 楼 tanxiangbo 2008-09-27  
楼主说了Ruby的类机制,说的很明白,很好,很强大!

相关推荐

    ruby中文教程,从基础到深入的让你学习ruby

    Ruby提供了许多工具来进行元编程,如`eval`函数可以执行字符串中的代码,`class_eval`和`instance_eval`允许在运行时修改类或对象的行为。此外,Ruby的`send`方法可以动态调用方法,`method_missing`可以捕获未定义...

    Ruby元编程第二版中文

    在Ruby中,元编程的强大之处在于其语法简洁且易于理解,使得程序员可以轻松地实现动态行为。Ruby提供了多种元编程工具,包括: 1. **方法定义与调用**:Ruby允许在运行时定义和修改方法,如`define_method`函数可以...

    Ruby入门教程中文PDF 附实例

    本教程针对初学者,旨在帮助读者快速掌握Ruby的基础知识,并通过实例深入理解其用法。 首先,Ruby的基本语法是它的一大亮点。Ruby允许开发者以更自然的方式编写代码,这得益于它的语法接近于英语。例如,变量的声明...

    ruby中文教程(源代码)

    本教程针对初学者,旨在帮助你快速掌握Ruby的基础知识,并通过源代码实例加深理解。 1. **Ruby基础** - 变量:Ruby支持五种变量,包括局部变量(`local`)、实例变量(`instance`)、类变量(`class`)、全局变量...

    Ruby语言中文教程.rar

    本教程针对初学者设计,旨在帮助读者快速掌握Ruby的基础知识,并通过实例深入理解其核心概念。 首先,Ruby的基础语法是学习的重点。Ruby语言允许程序员以一种自然、接近英语的方式来编写代码,使得代码更易读、易写...

    ruby语法基础教程及Ruby教程中文版和安装文件

    通过阅读和实践教程中的例子,你可以逐步提升对Ruby的理解和应用能力。 总的来说,Ruby是一门易学易用的编程语言,尤其适合Web开发和脚本编写。它的强大功能和灵活语法使得编程变得更加愉快。希望这个基础教程和...

    Ruby-Ruby的面向对象的枚举

    在Ruby编程语言中,"面向对象的枚举"是一个重要的概念,它结合了面向对象编程的灵活性和枚举类型的效率。Ruby的枚举通常指的是枚举类(Enum Class),这是一种自定义枚举类型的方法,允许我们创建具有特定行为的枚举...

    ruby元编程.pdf

    4. 特殊方法(Eigenclasses):在Ruby中,每个类都有一个与其相关的单独类,被称为 eigenclass 或 singleton class,也常被称为 metaclass。通过理解 eigenclass 的工作原理,程序员可以实现更高级的元编程技巧,...

    Ruby-Watir在Ruby中Web应用程序测试

    这个工具的名字“Watir”是“Web Application Testing in Ruby”的缩写,它将简洁的Ruby语法与强大的网页自动化能力相结合,提供了高效且易于理解的测试解决方案。 Watir支持多种主流浏览器,如Internet Explorer...

    ruby 中文教程,张开川写的

    在Ruby中,你可以使用`require`关键字来引入其他文件,`class`定义新的类,`def`定义方法,`attr_accessor`快速创建属性的getter和setter,`if`、`unless`进行条件判断,`while`、`until`、`for`进行循环,`begin`、...

    Ruby基础教程(中文第4版)

    在本书中,读者将深入理解Ruby的基础概念,逐步掌握其核心特性。 首先,Ruby的基础知识包括变量、常量和符号。Ruby支持四种类型的变量:局部变量、实例变量、类变量和全局变量,它们各自在不同范围内起作用。常量是...

    Ruby语言中文教程

    - 教程中可能包含对Ruby环境的汉化配置,这对于中文用户来说,能提升学习体验,使其更易理解和操作。 10. **实战项目** - 实践是检验理论的最好方式。教程中的代码实例可以帮助你将所学应用于实际项目,如创建...

    Ruby中文参考手册

    11. **类和对象初始化**:Ruby中通过initialize方法初始化对象,而Class.new可以用来创建新的类。 12. **Ruby on Rails**:尽管手册可能主要关注语言本身,但也会涉及Rails框架的基本概念,如MVC架构、路由、数据库...

    Best of Ruby Quiz

    《Best of Ruby Quiz》通过一系列精心设计的问题和解答,帮助读者巩固和拓展对Ruby的理解,提高编程技巧和解决问题的能力。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。阅读这本书,不仅能够提升编程能力...

    ruby trap 初学者使用

    Ruby是一种强大的、面向对象的编程语言,以其简洁的语法和灵活的编程理念而...通过阅读"Ruby Trap"电子书,初学者可以对这些潜在的问题有更深入的理解,并学会如何在实际编程中避免这些陷阱,从而更好地掌握Ruby编程。

    Ruby语言入门教程

    Ruby是一种面向对象的脚本语言,它以其简洁、优雅的语法和强大的编程能力而闻名。本教程旨在为初学者提供一个全面的Ruby...在实践过程中,不断加深对Ruby的理解,你将发现它不仅是一种工具,更是一种享受编程的方式。

    Ruby-一个Ruby的例子

    在这个"Ruby-一个Ruby的例子"中,我们将探讨Ruby的基础知识,以及如何通过具体的代码示例来理解其核心特性。 首先,Ruby的面向对象特性是其核心之一。在Ruby中,一切都是对象,包括基本数据类型如数字、字符串和...

    Ruby API 帮助文档.zip

    10. **Ruby中文帮助文档**: 对于中文开发者来说,中文版的Ruby API文档尤其重要,它可以帮助理解语言的细节,解决开发过程中的问题。文档通常包括详细的API接口介绍、示例代码和解释,对于初学者和经验丰富的开发者...

    ruby metaprograming

    模块是Ruby中的一种组织代码的方式,它们可以被混入到类中以扩展类的功能。 **示例**: ```ruby module EnumerableMethods def sum reduce(0) { |acc, x| acc + x } end end class Array include ...

    Ruby 基础语法 视频教程1

    通过`ruby-4-variables.mp4`和`ruby-5-variables-rules.mp4`,你可以深入理解变量的用法和规则,而`ruby-6-expression.mp4`将帮助你掌握如何在Ruby中构建和使用表达式。这些视频教程将为你提供一个坚实的Ruby编程...

Global site tag (gtag.js) - Google Analytics