使用bless创建错误对象的Perl方法。不确定这种方法的内部工作原理

时间:2016-04-05 14:29:24

标签: perl object

我收到了一个创建对象的解决方案,该对象是一个带有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()方法中究竟发生了什么。

1 个答案:

答案 0 :(得分:1)

在Perl中,对象只是bless编辑的常规数据结构。这在perlobj

中有解释
  

对象只是与特定类明确关联的Perl数据结构(散列,数组,标量,文件句柄等)。

     

显式关联是由内置的bless函数创建的,该函数通常在类的构造函数子例程中使用。

致电时

bless { foo => 'bar' }, $class;

在构造函数中,你

  1. 创建对匿名哈希的引用

  2. 将哈希引用转换为对象,方法是将其传递给bless

  3. 以上内容可以重写如下,这使得对象更加清晰,只是常规的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转换为对象。您可以将messagecodettfatalwiki_page视为对象的属性。