3-8《Ruby元编程》

《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.

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

2.4What Happends when you call a method?

  1. 查找方法。Method lookup. receiver和ancestors-chain
  2. 执行这个方法。self

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

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

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

Method Execution

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

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

Private私有方法

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

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

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

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

Refinement求精炼,细化:防止猴子补丁的破坏。

  1. 首先,定义一个模块
  2. 然后,在这个模块的定义中调用refine方法。
  3. 在一个模块内部,使用using method_name,细化的作用范围就限定在该模块内部了。

原文地址:https://www.cnblogs.com/chentianwei/p/8531089.html

时间: 2024-10-04 18:23:36

3-8《Ruby元编程》的相关文章

Ruby 元编程

Ruby 语言在抽象层面有了元编程支持,功能相当强大,如果业务模型有很大的相似性,相信元编程会让你节省大量代码. 举一个小例如下,(这里只是使用了一个class_eval , 还有instance_eval, module_eval, Function.parameters等大量方法可以调用) 比如 ,根据业务需求,需要创建多个有相似方法名的类, 比如方法都命令为 include_xxx, append_xxx, delete_xxx,  xxxs等 xxx 为具体的业务类. 那么可以设计如下一

201707《Ruby元编程》

元编程不过是编程--经典必读 作用域(绑定) 改变作用域的关键字, 分别是module,class和def.我们称为作用域的门(scope gate) instance_eval以实例作用域执行代码 class_eval以类定义作用域执行代码 Kernel#eval方法,当前上下文中直接执行代码字符串 instance_eval class_eval 对象 单例方法 -- 类名(元类对象) 类方法 实例方法 表格是不精准.不完备的表达,instance_eval.class_eval使用时需要注

读《Ruby 元编程》

通过许多法术,Ruby 有的编程技巧来实现很多巧妙的编程: 数组参数 环绕别名 白板 类扩展 类扩展混入 类实例变量 类宏 洁净室 代码处理器 上下文探针 延迟执行 动态派发 动态方法 动态代理 扁平作用域 幽灵方法 钩子方法 内核方法 惰性实例变量 拟态方法 猴子打补丁 -- 上面的高级些的技巧,来实现更简洁的编程(只是指总行数),方便修改上. 一个文件成千行,还是存在的. 要看懂,还要了解些 Ruby 的基础才行的. 推荐 2星

Ruby元编程::对象模型

对象由一组实例变量和一个类的引用组成. 对象的方法存在于对象所属的类中(从类的角度看,它们叫做实例方法). 类本身是Class类的对象.类的名字不过是一个常量而已. Class类是Module的子类.一个模块基本上是由一组方法组成的包.类除了具有模块的特性之外,还可以被实例化(通过new()方法)及被组织为层次结构(通过它的super-class()方法). 常量像文件系统一样,是按照树形结构组织的.其中模块和类的名字扮演目录的角色,其他普通的常量则扮演文件的角色. 每个类都有一个祖先链,这个链

ruby元编程——编写代码的代码

Kernel#eval()方法,可以直接执行ruby代码字符串 (1)Kernel#binding()方法用来捕获当前作用域返回一个Binding对象,Binding对象表示一个完整的作用域 (2)eval()可以接受两个参数,第一个是代码字符串,第二个是Binding对象,代码会在传入的作用域中执行(*eval()家族都可以) (3)Ruby还提供了一个名为TOPLEVEL_BINDING的预定义常量,他表示顶级作用域的Binding对象.可以在程序的任何地方访问这个顶级作用域 (4) eva

201706 Ruby 基础 & 元编程

yield 所有的"方法(methods)"隐式跟上一个"块(block)"参数. 块参数也可以明确给定,形式就是在参数前面加一个"&",比如 def fn(arg1, arg2, &block) end,其中的 &block 就是明确给定的块参数. 块参数的动作,可以通过调用 call() 方法执行,还可以用 yield 来执行 -- yield 其实就是一个语法糖. 所以以下几种写法常常是等价的: #method re

C++模板元编程 - 2 模仿haskell的列表以及相关操作

这是昨天和今天写的东西,利用C++的可变模板参数包以及包展开,模式匹配的一些东西做的,感觉用typename...比轮子叔那个List<A,List<B, List<C, D>>>的设计要好看不少. List有一个很巧妙的继承,只有那么做才能使用类似于List<>::Rest的写法,直接定义成template<typename T, typename... TArgs>List是不行的. Change这里可以给一个args...换另一个包装,这里

《Effective C++》:条款48:认识template元编程

Template metaprogramming(TMP,模板元编程)是编写template-based C++程序,编译的过程.template metaprogramming是用C++写的模板程序,编译器编译出具体化的过程.也就是说,TMP程序执行后,从templates具体化出来C++源码,不再是模板了. TMP有两个作用,一是它让某些事更容易.例如编写STL容器,使用模板,可是存放任何类型元素.二是将执行在运行期的某些工作转移到了编译期.还有一个结果是使用TMP的C++程序可能在其他方面

C++拾遗--模板元编程

C++拾遗--模板元编程 前言 模板元是用于递归加速的,把运行期的函数调用变到编译期进行代码展开,类似于内联函数.下面看一个实例:斐波那契数列第n项求解. 模板元编程 #include <iostream> #include <ctime> using namespace std; //递归法 int fib(int n) { if (n < 0) return 0; if (n == 1 || n == 2) return 1; return fib(n - 1) + fi