`
zealot2007
  • 浏览: 10768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Advanced Rails学习笔记

阅读更多

    闲言碎语,以阐明ruby方法调用的原理。

    先决条件:
when a method is called, it is said that one is sending a message. The receiver is the object that the message is sent to.
当一个方法被调用,即说发送一个消息,这个消息的接收者即是方法的调用者。
例如:
o = Object.new
o.inspect
Object实例o调用了inspect方法,实际就是说给o发送一个调用inspect方法的消息。

 

    进入正题:

class A
end

class B < A
end

b = B.new
b.to_s #=>#<B:0x1cd3c0>

 执行过程:
1.沿b对象的klass指针找到B;(b是B的一个实例, b的klass指针指向B, klass指针通俗讲就是由实例指向类的指针,蕴含一种is_a?的概念,例如:b是B类的实例,则b的klass指针就指向B)

2.在B的m_tbl中查找是否存在to_s这个方法;(在类的内部存在一个m_tbl结构,实质是一个hash,它保存了该类的实例方法,注意:是实例方法;同时还存在一个iv_tbl的hash,保存该类的实例变量)

3.发现B内不存在to_s这个方法,则沿B的super指针找到A;(在类的内部存在一个super指针,指向其父类,外部调用就是B.superclass)

4.在A的m_tbl中仍然没有查找到to_s这个方法,于是沿A的super指针找到Object;(ruby 中的所有类都继承自Object)

5.Object包含to_s这个方法,因此该方法被调用(实际是调用原生方法 rb_any_to_s),返回类似"#<B:0x1cd3c0>"的结果。在这里,rb_any_to_s方法会检查原始消息的接收者的klass指针,来判断显示哪个类(是显示#<B:0x1cd3c0>,而不是#<A:0x1cd3c0>或#<Object:0x1cd3c0>)。原始消息的接收者是b,它是B类的实例,因此它的klass指向B,因此显示#<B:0x1cd3c0>。


ruby类的继承
    A继承Object, B继承A。 super chain: B ---> A ---> Object。这种由B到A,再到 Object的chain在ruby里称为lookup chain。

    这样当B的一个实例b调用某一方法时,会依次按照lookup chain进行查找。当类之间不仅有继承,而且有mixin的情况出现时,lookup chain就会有一些变化。如下:

module M
  def test
    puts "mod_method"
  end
end

class A
  def test
    puts "cls_method"
  end
end

class B < A
  include M
end

b = B.new
b.test #=> mod_method

 
    这时,lookup chain: B ---> [M] ---> A ---> Object,这里在B到A之间插入了一个M,之所以加上[]标记,是为了区分它与lookup chain上其他成员的区别。实际上这个[M]是对module M的klass的一个代理,ruby里称为ICLASSes。[M]包含了指向Module M的m_tbl和iv_tbl的指针。


    当B的实例b调用test方法时,b会沿自己的klass指针找到B,然后在B中查找test方法,miss后直接沿super指针向上层找到[M],然后发现test方法并执行之。这也是为什么 b.test调用会返回mod_method而不是cls_method的原因。





2
0
分享到:
评论

相关推荐

    Advanced Rails

    "Advanced Rails" 涵盖了Rails开发中的高级主题和技术,是Ruby on Rails学习进阶的重要资源,尤其适合已经对基础Rails有一定了解的开发者。 在Web开发领域,Rails以其高效、简洁的代码和“约定优于配置”的哲学吸引...

    rails查询学习笔记

    标题 "rails查询学习笔记" 涉及的是Ruby on Rails框架中的数据库查询技术。Ruby on Rails,简称Rails,是一款基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,使得开发Web应用更加高效...

    Advanced Rails Recipes(随书源码)

    "Advanced Rails Recipes" keeps you on the cutting edge of Rails development and, more importantly, continues to turn this fast-paced framework to your advantage. "Advanced Rails Recipes" is filled ...

    Advanced Rails Recipes(英语清晰文字pdf+源码)

    "Advanced Rails Recipes" keeps you on the cutting edge of Rails development and, more importantly, continues to turn this fast-paced framework to your advantage. "Advanced Rails Recipes" is filled ...

    常用RAILS学习网站

    收集了常用RAILS学习的网址 收集了常用RAILS学习的网址

    Advanced Rails Recipes

    这为那些希望学习高级Rails技术但又受限于经济条件的学习者提供了一个绝佳的机会。同时,它也鼓励了技术社区内的知识共享精神。 #### 部分内容中的关键知识点 ##### Part I—REST and Routes Recipes 这部分主要...

    Rails 学习资料

    标题“Rails学习资料”表明这是一份关于Rails框架的学习资源,可能包含教程、示例代码、最佳实践等内容,适合初学者和有一定经验的开发者。描述中的“仅仅三分,就可以帮助你搭好框架”,暗示这份资料可能包含快速...

    rails学习教程

    本教程将带你走进Rails的世界,从零开始学习这个强大的框架。 一、Rails框架基础 Rails是David Heinemeier Hansson在2004年创建的,它引入了“Convention over Configuration”(约定优于配置)的理念,减少了...

    ruby on rails 笔记(陈刚)

    从给定的文件信息来看,这份文档是陈刚关于Ruby on Rails的学习笔记,旨在帮助初学者更好地理解并掌握Ruby on Rails这一流行的Web开发框架。以下是对文档中提及的关键知识点的详细解析: ### 安装与配置 #### Ruby...

    Ruby_On_Rails笔记

    综上所述,Ruby on Rails的笔记内容涵盖了从安装Rails环境到创建和运行一个简单的Rails项目的基础知识,这些内容对于初学者来说是学习Rails框架的极好入门材料。通过对这些知识点的学习,初学者可以快速了解Rails的...

    Advanced.Rails(2007)].Brad.Ediger.文字版.pdf

    综上所述,《Advanced Rails》是一本深度解析Rails框架高级特性的书籍,不仅覆盖了技术层面的知识点,还提供了丰富的学习资源和支持。对于希望提升Rails技能的开发者来说,本书具有很高的参考价值。

    Ruby_on_Rails笔记

    在《Ruby on Rails笔记》中,作者陈刚分享了他在学习Ruby on Rails过程中的经验与心得。这份笔记不仅包含了作者的学习历程和个人体会,还汇集了他在学习过程中遇到的问题及其解决方案。作者提到,“读不如做,做不如...

    Advanced RESTful Rails Presentation

    ### 高级RESTful Rails应用知识点解析 #### 标题:高级RESTful Rails演示 - **RESTful**:表示该应用遵循REST(Representational State Transfer)原则,这是一种用于设计网络应用程序的架构风格。 - **Rails**:...

    rails学习免费书籍

    Ruby On Rails是一个用于编写网络应用程序的软件包.它基于一种计算机软件语言Ruby,给程序开发人员提供了强大的框架支持.本书介绍了rails的基本使用,深入扩展,练习挺多的

    Pragmatic.Bookshelf.Advanced.Rails.Recipes.May.2008

    《Pragmatic Bookshelf Advanced Rails Recipes May 2008》是一本专注于Rails高级开发实践的书籍,由Pragmatic Bookshelf出版社于2008年5月出版。这本书主要面向已经熟悉Ruby on Rails基础的开发者,旨在通过一系列...

    advanced rury on rails recipes

    从给定的文件信息来看,我们探讨的主题是“高级Ruby on Rails食谱”(Advanced Rails Recipes),这是一本旨在为专业Ruby on Rails(RoR)开发者提供深入指导的专业参考手册。尽管该书尚处于开发阶段,但其目标是...

    ruby on rails 学习资料

    "ruby on rails 学习资料pdf"可能是综合性的学习指南,包含了从初学者到进阶者的各种主题,包括Rails的安装和配置、模型关系、控制器逻辑、视图渲染、部署到生产环境等。 "ruby on rails环境搭建.doc"会详细指导你...

    rails 入门详细笔记

    rails官网入门笔记的翻译,非常不错的rubyonrails入门教程!

Global site tag (gtag.js) - Google Analytics