首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未在Builder方法中定义的驼鹿属性

未在Builder方法中定义的驼鹿属性
EN

Stack Overflow用户
提问于 2016-03-03 17:58:15
回答 1查看 245关注 0票数 1

我使用Moose创建了一个对象,但是构建器方法'_initialize_log‘无法检索name属性值。

是否有一种方法仅在设置了该属性之后才运行该方法?

EFT.pm

代码语言:javascript
复制
package EFT;
use Moose;

# Attributes
has name => (
    is       => "ro",
    isa      => "Str",
    required => 1
);

has log => (
    is      => 'rw',
    isa     => 'Str',
    builder => '_initialize_log'
);

sub _initialize_log
{
    $self->{'log'} = "****\n";
    $self->{'log'} .= $self->{'name'} . "\n";
    $self->{'log'} .= `date`;
    $self->{'log'} .= "****\n";
}

test.pl

代码语言:javascript
复制
#!/usr/bin/perl

use strict;
use warnings;
use EFT;

# Constants
use constant NAME => 'Test Script';

# Create script object
my $script = EFT->new(name => NAME);

print $script->{'log'};

输出

代码语言:javascript
复制
Use of uninitialized value in concatenation (.) or string at EFT.pm line 46.
****

Thu Mar  3 12:54:31 EST 2016
****
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 18:07:40

该对象仍在构造中!将属性的初始化推迟到构造之后。以下内容将它的初始化推迟到使用时:

代码语言:javascript
复制
lazy => 1

您也可以使用BUILD方法代替。

代码语言:javascript
复制
sub BUILD {
   my $self = shift;
   $self->_initialize_log();
}

请注意,_initialize_log中有三个bug

代码语言:javascript
复制
sub _initialize_log
{
    my $self = shift;              # <-- Won't even compile without this!
    my $log = "****\n";
    $log .= $self->name . "\n";    # <-- Removed reliance on Moose internals
    $log .= `date`;
    $log .= "****\n";
    return $log;                   # <-- The value is to be returned.
}

要从BUILD而不是作为构建器调用它,您需要按以下方式对其进行更改:

代码语言:javascript
复制
sub _initialize_log
{
    my $self = shift;
    my $log = "****\n";
    $log .= $self->name . "\n";
    $log .= `date`;
    $log .= "****\n";
    $self->log($log);              # <--
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35779562

复制
相关文章

相似问题

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