类定义揭秘
当前类小结
- 在类定义中,当前对象self就是正在定义的类。
- Ruby解释器总是追踪当前类(模块)的引用。所有使用def定义的方法都成为当前类的实例方法。
class MyClass
def method_one
def method_two
'Hello!'
end
end
end
obj = MyClass.new
obj.method_one
obj.method_two # => "Hello!"
- 在类定义中,当前类就是self——正在定义的类。
- 如果有一个类的引用,则可以用class_eval()(或module_eval())方法打开这个类。
类变量
类变量与类实例变量不同,它可以被子类或类的实例所使用。
不幸的是,类变量有一个很不好的怪癖。下面是一个例子:
@@v = 1
class MyClass
@@v = 2
end
@@v # => 2
得到这样的结果是因为类变量并不真正属于类——它们属于类体系结构。由于@@v定义于main的上下文,它属于main的类Object……所以也属于Object的所有后代。MyClass继承自Object,因此它也共享了这个类变量。
单件方法
只针对单个对象生效的方法,称为单件方法。
str = 'hello'
def str.title?
self.upcase == self
end
关于类方法的真相
def object.method
end
在上面的定义中,object可以是对象引用、常量类名或self。在这三种方式中,定义的语法可能看起来有些不同——但实际上,底层的机制都是一样的。
类宏
Eigenclass
大一统理论
Ruby对象模型可以总结为7条规则:
1.只有一种对象——要么是普通对象,要么是模块。
2.只有一种模块——可以是普通模块、类、eigenclass或代理类(把模块混合进入到祖先链中)。
3.只有一种方法——它存在于一种模块中——通常是类中。
4.每个对象(包括类)都有自己的“真正的类”——要么是普通类,要么是eigenclass。
5.除了BasicObject类无超类外,每个类有且只有一个超类。这意味着从任何类只有一条向上直到BasicObject的祖先链。
6.一个对象的eigenclass的超类是这个对象的类;一个类的eigenclass的超类是这个类的超类的eigenclass。
7.当调用一个方法,Ruby先向“右”迈一步进入接收者真正的类,然后向“上”进入祖先链。这就是Ruby查找方法的全部内容。
Object.extend
环绕别名
1.给方法定义一个别名。
2.重定义这个方法。
3.在新的方法中调用老的方法。