- 论坛徽章:
- 0
|
下面是定义的一个类. 类中的testfunc2()要调用testfunc(), 发现还是要写 testfunc($this,a,b)..
我看有文档上说可以这么写 &testfunc(a,b), 不过这样只有b参数被传递了,a被当class类shift掉了.
在class里一个函数调用另一个函数,没有固定的写法。
可以直接调用,例如:
sub _a {
my $arg = shift;
...
}
_a('arg');
也可以通过$self来调用,例如:
sub _a {
my $self = shift;
my $arg = shift;
...
}
$self->_a('arg');
取决于你如何调用,函数定义稍有不同。
我两种写法都用过,如果_a()里需要访问$self属性的话,就用第二种。否则用第一种。
还有网上的文档里说要将类的方法export出去后才能供其它包使用. 比如 require Exporter; @ISA = qw (Exporter); @EXPORT = qw ( readfile checkfile);
为什么我没有export, 而其它包比如pkg2.pm, 在里面直接 use state; 再 $state=state->new(); $state->testfunc(); 照样可以调用到.
perl没有私有函数的概念。函数一旦定义,就写入该package的符号表,所以永远可以通过$class->func()或者Class::func()的方式来访问这个函数,不管你是否认为它是私有的。
Exporter这个模块,只是做了一些符号表别名的操作,例如把package的符号表的部分,别名到main的符号空间。
在package里没有export的函数,在caller里不能直接使用。需要通过目标或全包名才能调用。
还有说类内的变量必须通过函数才能访问,但是我在pkg2.pm中照样可以通过 $state->{name} 直接访问state对象的变量.
你访问的是bless的目标里的一个属性,该属性通常来说是作者有意隐藏的,但不代表你不可以访问它。
sub new {
my $class = shift;
bless { name => 'john', sex => 'male', age => 20 }, $class;
}
一旦new,everywhere都能访问到这个目标里的name, sex, age属性。
是不是perl面向对象很慢? 我用perl改写之前写的delphi程序,速度变慢得非常多..
perl面向对象其实是用一系列技巧来模拟的,只是写起来你觉得很OO,但本质上不是OO(看看ruby的OO设计体系)。
由于进行了一些封装,所以perl OO会比纯函数稍慢一点。
但至于你说的速度变慢很多,不一定与OO有关,而可能是:
1)delphi是编译性语言,而perl不是;
2)程序写的不是很高效,等等。 |
|