Tips
- 类名不过是常量
- 对象包含了实例变量,它就好像一个Hash表一样。
- 方法存放在类之中。
类自身也是对象
"hello".class #=> String
String.class #=> Class
Class.class #=> Class
String.ancestors
#=> [String, Comparable, Object, Kernel, BasicObject]
Object.superclass
#=> BasicObject
Class.ancestors
#=> [Class, Module, Object, Kernel, BasicObject]
-
所有的类都是Class的子类,而Class继承自Module。所以类只是比模块多了
superclass()
,new()
,allocate()
这三个方法。 -
Kernel只是mixin在BasicObject里的一个模块,它能出现在ancestors中,但并不代表Object继承自Kernel。因为这个祖先链的关系,所以所有对象都能调用Kernel里的方法。
self
顶级上下文:
self #=> main
slef.class #=> Object
当开始运行ruby程序的时候,解释器会创建一个名为main的对象最为当前对象,它被称为顶级上下文(top level context)是因为这时处在调用堆栈的顶层:这时要么还没有调用任何方法,要么调用的方法都已经返回了。P.S. Ruby的main对象和C系的main函数没有关系。
private
- 如果调用方法的接收者不是自己,则必须指明一个接收者;
- 私有方法只能被隐含接收者调用;
所以,不能明确指定一个接收者调用一个私有方法,即每次调用私有方法只能用隐含的接收者self调用。
所以与C系语言不同的是,子类可以调用基类的私有方法。
网友评论