Perl类方法无法访问对象属性的问题咨询及求解
Perl类方法中$self未声明错误及类型属性获取解决方案
问题1:构造函数中的$self无法在printMe方法中访问的原因
Perl调用对象方法时,解释器会自动把对象本身作为第一个参数传递给方法。你写的printMe方法没有接收这个参数,加上use strict强制要求变量声明,所以编译器报错$self未声明。
构造函数里的$self是new子例程的局部变量,作用域仅限于new内部,和printMe里的$self完全是两个独立变量,必须在printMe里显式接收第一个参数并赋值给$self,才能访问对象属性。
问题2:引用构造函数中的type属性
构造函数里的$type是类名(比如Guy),你已经通过bless $self, $type把哈希引用关联到了这个类,所以不需要额外存到$self哈希里——直接用ref($self)就能获取对象所属的类名。如果一定要把类型存为对象属性,也可以在构造函数里添加$self->{type} = $type;。
修正后的完整代码
#!/usr/bin/perl use warnings; use strict; package Guy; sub new { my $type = shift; my %params = @_; my $self = {}; $self->{'First'} = $params{'First'}; $self->{'Middle'} = $params{'Middle'}; $self->{'Last'} = $params{'Last'}; # 可选:如果要把type存为对象属性,添加这一行 # $self->{type} = $type; bless $self, $type; return $self; # 构造函数必须返回对象引用,之前漏掉了 } sub printMe { my $self = shift; # 接收对象参数,赋值给$self printf "-----------------------------------\n"; # 用ref($self)获取类名,或者如果存了$self->{type}就用后者 printf "My type is: \"%s\"\n", ref($self); printf "First :: %s\n", $self->{First}; printf "Middle :: %s\n", $self->{Middle}; printf "Last :: %s\n", $self->{Last}; printf "-----------------------------------\n"; } package main; my $dude = Guy->new( 'First' => "John", 'Middle' => "Jacob", 'Last' => "Smith" ); $dude->printMe();
关键改动说明
printMe方法开头添加my $self = shift;,接收对象参数。- 构造函数
new末尾添加return $self;——Perl构造函数必须返回对象引用,之前的代码漏掉了这一步,会导致$dude为undef。 - 打印类型时用
ref($self)获取类名,或者如果选择把$type存入$self,就用$self->{type}。 - 把printf的变量从双引号中移出,避免字符串插值问题,符合Perl最佳实践。
内容的提问来源于stack exchange,提问作者Pete
相关产品推荐
相关产品推荐

