<Ruby>元编程第四章笔记

1 所有使用def定义的方法都成为当前类的实例方法.
2 Module#class_eval()方法会在一个已存在类的上下文中执行一个块:

1 def add_method_to(a_class)
2  a_class.class_eval do
3   def m; 'Hello!'; end
4  end
5 end
6 
7 add_method_to String
8 "abc".m  #=> 'Hello!'

 

3 当self不是一个类时,当前类的角色由self的类来充当.处于顶级作用域时,此时当前类是Object----main对象的类.这也就是为什么当在顶级作用域中定义方法的时候,这个方法会成为Object类实例方法的原因.

4 如果想打开一个类,并不在乎它是不是类,那么用Object#instance_eval()方法更好,如果是希望打开一个类,那么Module#class_eval()方法是更好的方式.
5 Ruby解释器假定所有的实例变量都属于当前对象self.在类定义时也是如此:

1 class MyClass
2  @my_var = 1
3 end

 

6 类实例变量仅仅可以被类本身所访问----而不能被类的实例或子类所访问.
  类变量可以被类的实例或子类所使用.
  --避免使用类变量,尽量使用类实例变量.

7

1 class MyClass
2  attr_accessor :my_attribute
3 end

 

Module#attr_accessor() , 同时生成读方法和写方法.  像attr_accessor()这样的方法称为类宏.类宏是普通的方法,只是可以用在类定义中而已.

8 每个eigenclass只有一个实例,并且不能被继承,因此也被称为单件类.eigenclass是一个对象的单件方法的存活之所.
9 如果对象有eigenclass,那么Ruby不是从它所在的类开始,而是先从这个eigenclass类中开始查找方法.
10 eigenclass的超类就是超类的eigenclass.

11 Ruby对象模型的七条规则:
(1) 只有一种对象--要么是普通对象,要么是模块.
(2) 只有一种模块--可以是普通模块,类,eigenclass或代理类.
(3) 只有一个方法,它存在于一种模块中--通常是类中.
(4) 每个对象(包括类)都有自己的"真正的类"--要么是普通类,要么是eigenclass.
(5) 除了BasicObject类无超类外,每个类有且只有一个超类.这意味着从任何类只有一条向上直到BasicObject的祖先链.
(6) 一个对象的eigenclass的超类是这个对象的类;一个类的eigenclass的超类是这个类的超类的eigenclass.
(7) 当调用一个方法,Ruby先向"右"迈一步进入接收者真正的类,然后向"上"进入祖先链.这就是Ruby查找方法的全部内容.

12 如果想添加专属于某个指定类的属性,可以在它的eigenclass中定义该属性:

1 class MyClass
2  class << self
3   attr_accessor :c
4  end
5 end
6 
7 MyClass.c = "It works"
8 MyClass.c    #=> "It works"

 

13 当类包含模块时,它获得的是该模块的实例方法--而不是类方法.模块的类方法存在于模块的eigenclass中.
14 类扩展:类的eigenclass的实例方法,就是类的类方法
15 Object#extend() : 用作类扩展和对象扩展,是在接收者eigenclass中包含模块的快捷方式.
16 alias关键字,给方法取别名.
alias :m :my_method  //注意是关键字,所以中间没有逗号.
Module#alias_method()方法, 和alias关键字功能一样.

17 当重定义一个方法时,并没有真正修改这个方法.相反,会把当前存在的这个方法名字跟定义的新方法绑定起来.只有老的方法还存在绑定的名字,仍旧可以调用它.
18 环绕别名:
(1) 给方法定义一个别名
(2) 重定义这个方法
(3) 在新的方法中调用老的方法

posted on 2014-03-05 20:42  秋叶leaf  阅读(295)  评论(0)    收藏  举报