- 论坛徽章:
- 1
|
问题1的回答:
hash 里面没有存它的方法,这完全是 -> 操作符的功劳。-> 操作符其实也没有什么神秘之处,它只不过是调用了一下它右边的那个 sub(注),并且把左边的那个引用变量 unshift 到 sub 的参数列表中去。注:为了正确地找到右边的那个 sub,它还需要把左边的那个引用变量 ref 一下取出原先 bless 进去的那个 tag
问题2的回答:
你理解的是正确的。
问题3的回答:
new 的第一个参数是 $class,不是 $self,也就是说,new 的第一个参数是类名称,而不是对象,你估计是自己把自己绕糊涂了,根本就不存在你所说的“那个承载类的hash应该还没有创建吧”的问题——你该不会连“类”和“类的实例”这两个概念都搞不清楚吧?
问题4的回答:
bless 的作用是给第一个参数(必须是个引用)打上一个印记(就好像盖个戳一样),而这个印记就标明了这个引用从此以后应该属于哪个类。理解了这个之后,你就明白 bless $self, $class 和 $class = $self 其实是完全不同的东西。bless $self, $class 之后,$class 还是原来的值,$self 也还是原来的值,只不过 $self 的印记变成了 $class 的内容。$class = $self 则是把 $class 变成和 $self 值相同的一个变量。
题外话:
1,new 的名称不是 Perl 语法的一部分,你完全可以叫 create, construct, build, 或者别的东西。
2,对象也不一定要用 hash 引用来存储数据,事实上任何类型的引用都可以,只不过 hash 引用正好方便表示 OOP 里面的“属性=>值”这种模型而已。事实上,CPAN 上就有一组用数组引用来构造类体系的,更加省空间。
3,Perl 对 OOP 提供的语法很有限,但是支持 OOP 的大多数概念。这些有限的语法包括 bless 函数、package 语句、-> 操作符、还有 @ISA 数组,以及 SUPER UNIVERSAL 等有限的几个关键字。除此以外我想再没有别的东西了。 |
|