首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法来创建一个错误对象。不确定此方法的内部工作原理。

方法来创建一个错误对象。不确定此方法的内部工作原理。
EN

Stack Overflow用户
提问于 2016-04-05 14:29:24
回答 1查看 73关注 0票数 0

我收到了一个创建对象的解决方案,该对象是一个包含5个键的散列。但我不知道它到底是如何工作的。

这是我的错误库的例子,为了这个问题,我只包含了一个错误。ErrorLibrary.pm

代码语言:javascript
运行
复制
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中发现的错误散列,也可以接受一个字符串,这是在系统中实现错误消息的旧方法。

示例:

代码语言:javascript
运行
复制
die ASC::Builder::Error->new(CABLING_ERROR);

Error.pm

代码语言:javascript
运行
复制
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还包含以下方法,这些方法允许访问每个键的值。

代码语言:javascript
运行
复制
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};
    }

但是,正如我所说的,我主要想了解新()方法到底发生了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-05 22:24:31

在Perl中,对象只是经过bless编辑的常规数据结构。这在佩洛布中有解释

对象只是Perl数据结构(散列、数组、标量、文件句柄等)。与特定类显式关联的。 该显式关联由内置的bless函数创建,该函数通常在类的构造函数子例程中使用。

当你打电话的时候

代码语言:javascript
运行
复制
bless { foo => 'bar' }, $class;

在构造函数中,您

  1. 创建对匿名散列的引用
  2. 通过将哈希引用传递给bless,将其转换为对象

可以按照以下方式重写上面的内容,这使得对象只是隐藏在幕后的常规Perl数据结构更加清晰:

代码语言:javascript
运行
复制
my $self = { foo => 'bar' }; # create a hash reference
bless $self, $class;         # convert the hash reference to an object

您可以在此散列中添加尽可能少的或任意数量的键。使用哈希键作为描述对象的属性或属性是很方便的:

代码语言:javascript
运行
复制
my $self = {
    height => 'tall',
    color  => 'purple',
    weight => 17
};
bless $self, $class; # object has three attributes

在您的代码中:

代码语言:javascript
运行
复制
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视为对象的属性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36429287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档