看实例来解答

看实例来解答

看实例来解答
#! /usr/bin/perl
package Horse;
require Exporter;
@ISA=qw(Exporter);
@EXPORT=qw(new clone);
sub new{
my $invaction=shift;
my $class=ref($invaction)||$invaction;
my $ref={color=>"bay",
legs=>4,
owner=>undef,
@_,
};
bless $ref;
return $ref;
}

sub clone{
my $model=shift;
my $self=$model->new(%$model,@_);
return $self;
}
1;

#! /usr/bin/perl
require "Horse.pl";
$steed=Horse->new(color=>"dun");
$foal=$steed->clone(owner=>"EquuGen Guild,Ltd");
print %$foal;

结果为ownerEquuGen Guild,Ltdcolordunlegs4

问题1:
在构造函数new()中
$invaction=shift 这行其主要原因是否是为了继承。类方法的第一个参数是类本身。
那么我把这行以及 my $class=ref($invaction)||$invaction;这行删除之后
运行结果为:bayHorseownerHorse=HASH(0x804c9b8)ownerownerlegs4EquuGen

为什么结果会不同呢?
用 Data::Dumper 把内容打.
用 Data::Dumper 把内容打出来就知道了。
[quote]
#! /usr/bin/perl
require "Horse.pl";
use Data::Dumper;
$steed=Horse->new(color=>"dun");
print Dumper $steed;
$foal=$steed->clone(owner=>"EquuGen Guild,Ltd");
print Dumper $foal;
[/quote]
在 new 里删掉 shift 之后,你的 @_ 的第一个值是 "Horse" , 自然不一样了。


[quote] my $class = ref ( $invaction ) || $invaction; [/quote]
Perl 里有 method 根据被调用的方法有两种 class method ( 既 Class::Name->method ) 和 instance method ( $ref->method ) , 上面这一行是用来保证 $class 的值永远是 $class 的真正名字。这是要结合 bless $ref, $class 使用的。


Perl 里的 OO 写法一般是 ( 注意 bless $self, $class 这一行 )
[quote]
sub new {
my $class = shift;
my $self = { }; # allocate new hash for object
bless($self, $class);
return $self;
}
[/quote]

具体看 perl 自带的文档 perltoot ( 运行 perldoc perltoot ) 或者看在线的文档
http://perldoc.perl.org/perltoot.html