对象方法的查找走向为:eigenclass -> MyClass -> Module -> Object(superclass) -> Kernel -> method_missing
类方法的查找走向为:eigenclass-> Class -> Module -> Object
Class中有两个new方法,一个为类方法Class.new,一个为实例方法new。
- Class.new
下面是ruby语言参考里的一段话:
新生成一个无名的superclass的子类. 若省略superclass则生成Object
的子类.
首次访问无名类的类名时, 将会搜索已赋值的常数名,然后把找到的常数名当做类名.
这样,我们就可以用一个常数名来构建一个新的Object子类了
类与模块分别是类Class和Module的实例
M = Module.new
C = Class.new
D = Class.new(C){
include M
}
把匿名模块或类赋给一个常量,那么常量的名字就是这个类或模块的名字。
所以我们可以这样写如下代码:
- class Point
- def initialize(x,y)
- @x, @y = x,y
- end
- attr_reader :x, :y
- def distance(point)
- Math.hypot(point.x - x, point.y - y)
- end
- end
这两段功能是相似的
- Point = Class.new do
- def initialize(x,y)
- @x, @y = x,y
- end
- attr_reader :x, :y
- def distance(point)
- Math.hypot(point.x - x, point.y - y)
- end
- end
- Class的new实例方法
Class里面的实例方法new是专门给类准备的,这个方法能让类完成如下操作
Class C
end
c = C.new
算法要找到一个类方法C.new,最后会在Class的实例方法中找到,因为“类”本身就是Class的一个实例。
--------(ruby编程语言 P272)