《Ruby元编程》


第二章 对象模型

类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法。

[].methods.grep(/^re/):调用 出Array的所有以re开头的method.

Monkeypatch:涉及全局修改,定义某个方法前应该仔细检查该类是否已有同名的方法。

实例对象存放在对象中,方法存放在类中。

类的真相:类本身也是对象。Ruby允许在运行时修改类的信息。

Class.instance_methods

Array.superclass  =>Object

模块

类也是模块,是带有三个方法new,allocate,superclass的增强模块。

代码要include,使用module.代码需要被实例化或被继承用class.

类就是一个对象外加一组实例方法和一个对其超类的引用。 类和其他对象一样必须通过引用来访问。

常量,任何以大写字母开头的引用(包括类名和模块名)。常量和变量的区别是作用域不一样。常量的作用域类似于文件系统中的文件,在不同目录下,不同的文件可以有相同的名字。

常量的路径:用::双冒号进行分隔。

Module.nesting方法:返回当前代码的路径

module M

class C

module M2

Module.nesting  #=>[M::C::M2, M::C, M]

end

end

end

Ruby常量,可以用module来存放常量,这样不同的类库的类名就不会产生冲突。

如Rake是流行的Ruby构建版本。gems/rake-1.0/lib/rake/task.rb

module Rake

class Task

#...

这里Task类的全名就变成 Rake::Task .  不会再和其他类库的类名冲突了。

命名空间Namespace : 只充当常量容器的模块。

2.4What Happends when you call a method?

  1. 查找方法。Method lookup(原则:object找到所在类,再顺着祖先链查找方法). receiver和ancestors-chain
  2. 执行这个方法。self

include:把模块插到祖先链中包含它的该类的后面。先查找该类的method。

prepend: 把模块插到祖先链中包含它的该类的前面。先在prepend 模块中查找method。

module Printable
  def print
    puts "sxx"
  end
  def prepare_cover
  end
end
module Document
  def print_to_screen
    prepare_cover
    print
  end
  def print
    puts "123"
  end
end
class Book
  include Printable
  include Document
  p ancestors    #=> [Book, Document, Printable, Object, Kernel, BasicObject]
end
b = Book.new
b.print_to_screen  #=>

kernel是核心模块被Object包含了。通过给Kernel模块加一个方法,就对所有对象可用了。这个方法称作内核方法.如Awesome_print包的方法ap就用了内核方法。

Method Execution

Ruby的每一行代码都会在一个对象中被执行--这个对象就是当前对象,self

没有明确指定receiver的method都在self上调用。

Private私有方法

1.如果调用方法的接收者不是自己,就必须指明接受者

2.私有方法只能通过隐性的接受者self调用。

3 所以只能在自身中调用私有方法,或者继承来的私有方法。--私有规则

顶层上下文top level context

如果没有调用任何方法,self是Ruby提供的叫main的对象(也称为top level context)main.class #=> Object

在类和模块定义中,self是这个类或模块本身。

Refinement 细化:

技巧用途:使修改kernal里的类的方法只在局部代码中有效,不会影响其他代码,防止猴子补丁。

Module#refine,Refine mod in the receiver.Returns a module, where refined methods are defined.

Module#using:Import class refinements from module into the current class or module definition.

  1. 首先,定义一个模块
  2. 然后,在这个模块的定义中调用refine方法。
  3. 在另一个模块内部,使用Module#using方法,细化的作用范围就限定在该模块内部了。或者在文件main中调用using,在文件结束前生效。
module StringExtensions
  refine String do
    def reverse
      "自定义的反转"
    end
  end
end
module StringStuff
  using StringExtensions
  p"my_string".reverse
end
p "my_string".reverse

3-8《Ruby元编程》第二章对象模型的更多相关文章

  1. 3-11 《Ruby元编程》第4章block块 3-12

    第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...

  2. [转]Windows Shell 编程 第二章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987893】

    第二章Shell的结构  “Shell 编程”的大伞之下有大量的API函数和COM接口.这个种类繁多的‘命令’集允许你用不同的方法对Windows Shell进行编程.函数和接口并不是两种提供相同功能 ...

  3. Ruby元编程:单元测试框架如何找到测试用例

    前几天看了Google Testing Blog上的一篇文章讲到C++因为没有反射机制,所以如何注册测试用例就成了一件需要各显神通的事情.从我的经验来看,无论是Google的GTest还是微软的LTM ...

  4. 201707《Ruby元编程》

    元编程不过是编程--经典必读 作用域(绑定) 打破作用域门的方式 对象模型图 七条规则 法术手册 作用域(绑定) 改变作用域的关键字, 分别是module,class和def.我们称为作用域的门(sc ...

  5. Ruby元编程:动态添加类属性及其实际应用

    上个星期测试道的Monkey老师和我聊到测试用例参数过多的问题,其实这样的问题在我这里也同样经历过.比如我的测试用例必须面对不同的测试环境,每个环境有无数的参数,开发的最初阶段,因为参数少,所以就放在 ...

  6. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

  7. 使用MYSQL数据库实现编程----第二章第三章课堂知识小总结

    第二章1:创建数据库create database myschool 2.数据类型  1.整型 int  2.小数 double  精确度要求高的 ----Decimal(18,4)  2222222 ...

  8. 读高性能JavaScript编程 第二章 让我知道了代码为什么要这样写

    代码为什么要这样写? function initUI(){ var doc = document, bd = doc.body, links = doc.getElementsByTagName_r( ...

  9. Java面向对象编程 第二章 第一个Java应用

    2.1创建Java源文件 Java应用由一个或多个扩展名为".java"的文件构成,这些文件被称为Java源文件,从编译的角度,则被称为编译单元. 本章包含两个Java源文件:Do ...

随机推荐

  1. Java设计模式应用——备忘录模式

    备忘录模式主要用于存档.游戏中我们打boss前总会存档,如果打boss失败,则读取存档,重新挑战boss. 可以看出来,备忘录模式一般包括如下数据结构 1. 存档文件:用于恢复备份场景的必要数据: 2 ...

  2. mysql日志文件目录

    默认情况下mysql的二进制日志文件保存在默认的数据目录data下,如:/usr/local/mysql/data 修改日志保存目录(/backup/mysqlbinlog/mysql-bin)的话: ...

  3. 我是怎么样和Linux结缘并通过红帽RHCE认证的

    我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#.C++之类的?大约在大 ...

  4. 开源|如何使用CNN将视频从2D到3D进行自动转换(附源代码)

    http://www.sohu.com/a/128924237_642762 全球人工智能 文章来源:GitHub 作者:Eric Junyuan Xie 它是如何运行的? 在运行代码之前,请先根据官 ...

  5. Python入门之软件开发目录规范

    本章重点: 理解在开发人标准软件时,如何布局项目目录结构,以及注意开发规范的重要性. 一.为什么要有好的目录结构 二.目录组织的方式 三.关于README的内容 四.关于requirements.tx ...

  6. Python装饰器的高级用法(翻译)

    原文地址 https://www.codementor.io/python/tutorial/advanced-use-python-decorators-class-function 介绍 我写这篇 ...

  7. 20145220韩旭飞《网络对抗》Exp2 后门原理与实践

    20145220韩旭飞<网络对抗>Exp2 后门原理与实践 常用后门工具实践 Windows获得Linux Shell 在Windows下,先使用ipconfig指令查看本机IP: 使用n ...

  8. 2018-2019-1 20189218《Linux内核原理与分析》第八周作业

    编译链接的过程 编译就是把文本形式源代码翻译为机器语言形式的目标文件过程. 链接是把目标文件.操作系统的启动代码和用到的库文件进行组织最终形成可执行代码的过程. 对于GCC来说,编译源代码并最终形成可 ...

  9. dp暑假专题 训练记录

    A 回文串的最小划分 题意:给出长度不超过1000的字符串,把它分割成若干个回文字串,求能分成的最少字串数. #include <iostream> #include <cstdio ...

  10. BZOJ5170: Fable 树状数组

    Description 有这么一则传闻,O(nlogn)的排序发明之前,滋滋国的排序都是采用的冒泡排序.即使是冒泡排序,对当时的国民 来说也太复杂太难以理解,于是滋滋国出现了这样一个职业——排序使,收 ...