我收到了一个创建对象的解决方案,该对象是一个带有5个键的哈希。但我不确定它是如何起作用的。
这是我的错误库示例,为了解决这个问题,我只包含了一个错误。 ErrorLibrary.pm
package ASC::Builder::ErrorLibrary;
use constant {
CABLING_ERROR => {
code => 561,
message => "cabling is not correct at T1.",
tt => { template => 'disabled'},
fatal => 1,
wiki_page =>'http://www.e-solution.com/index.php/ARC/Builder/ErrorCodes/CABLING_ERROR',
}
};
这是我的错误文件,其中包含许多方法;用于发布错误的new()。 新方法可以接受在ErrorLibrary中找到的Error哈希,否则它可以接受一个字符串,这是在系统中实现错误消息的旧方法。
示例:
die ASC::Builder::Error->new(CABLING_ERROR);
Error.pm
package ASC::Builder::Error;
sub new {
my ($package, $first_param) = (shift, shift);
if (ref $first_param eq 'HASH') {
my %params = @_;
return bless { message => $first_param->{message}, code => $first_param->{code}, tt => $first_param->{tt}, fatal => $first_param->{fatal}, wiki_page => $first_param->{wiki_page}, %params}, $package;
}
else {
my %params = @_;
return bless {message => $first_param, %params}, $package;
}
}
当我将错误哈希的每个键分配给$first_param
然后祝福所有这些时,我想要了解这个new()方法的确切情况。是通过使用bless函数将所有属性收集在一起并使用属性创建对象吗?
Error.pm还包含以下方法,允许访问每个键的值。
package ASC::Builder::Error;
sub message {
return $_[0]->{message};
}
sub tt {
return $_[0]->{tt};
}
sub code {
return $_[0]->{code};
}
sub fatal {
return $_[0]->{fatal};
}
sub wiki_page {
return $_[0]->{wiki_page};
}
但正如我所说,我主要想了解new()方法中究竟发生了什么。
答案 0 :(得分:1)
在Perl中,对象只是bless
编辑的常规数据结构。这在perlobj:
对象只是与特定类明确关联的Perl数据结构(散列,数组,标量,文件句柄等)。
显式关联是由内置的
bless
函数创建的,该函数通常在类的构造函数子例程中使用。
致电时
bless { foo => 'bar' }, $class;
在构造函数中,你
创建对匿名哈希的引用
将哈希引用转换为对象,方法是将其传递给bless
以上内容可以重写如下,这使得对象更加清晰,只是常规的Perl数据结构:
my $self = { foo => 'bar' }; # create a hash reference
bless $self, $class; # convert the hash reference to an object
您可以根据需要为此哈希添加尽可能少的键。将哈希键用作attributes或描述对象的属性很方便:
my $self = {
height => 'tall',
color => 'purple',
weight => 17
};
bless $self, $class; # object has three attributes
在您的代码中:
return bless {
message => $first_param->{message},
code => $first_param->{code},
tt => $first_param->{tt},
fatal => $first_param->{fatal},
wiki_page => $first_param->{wiki_page},
%params
}, $package;
您创建对具有至少五个密钥的匿名哈希的引用(如果%params
不为空,则更多);然后将hashref转换为对象。您可以将message
,code
,tt
,fatal
和wiki_page
视为对象的属性。