我收到了一个创建对象的解决方案,该对象是一个包含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',
}
};
这是我的错误文件,它包含许多方法;用于发布错误的新()。新方法可以接受在ErrorLibrary中发现的错误散列,也可以接受一个字符串,这是在系统中实现错误消息的旧方法。
示例:
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
an,然后祝福它们时,到底发生了什么。它是否将所有属性聚集在一起,并使用by函数从属性中创建一个对象?
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};
}
但是,正如我所说的,我主要想了解新()方法到底发生了什么。
发布于 2016-04-05 22:24:31
在Perl中,对象只是经过bless
编辑的常规数据结构。这在佩洛布中有解释
对象只是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
您可以在此散列中添加尽可能少的或任意数量的键。使用哈希键作为描述对象的属性或属性是很方便的:
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
视为对象的属性。
https://stackoverflow.com/questions/36429287
复制相似问题