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) 在新的方法中调用老的方法