代码之家  ›  专栏  ›  技术社区  ›  Brian Johnson

如何在Moose中处理可选参数?

  •  8
  • Brian Johnson  · 技术社区  · 16 年前

    编译器抱怨它“无法修改Parser.pm第16行的非左值子例程调用。”

        #!/usr/bin/perl -w
    
    package Parser;
    
    use Moose;
    
    require URLSpan;
    
    require WWW::Mechanize;
    
    has 'urlspan' => (is => 'rw', isa => 'URLSpan', required => 1);
    has 'mech' => (is => 'rw', isa => 'WWW::Mechanize');
    
    sub BUILD {
        my $self = shift;
        if(!$self->mech) {
            warn("no Mech set for " . $self->urlspan->name);
            $self->mech = WWW::Mechanize->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.4',
                                             stack_depth => 1
                                             ); #line 16
            }
    
    }
    
    3 回复  |  直到 16 年前
        1
  •  13
  •   friedo    16 年前

    $self->mech

            $self->mech( 
                WWW::Mechanize->new(
                    agent => 'xyz',
                    stack_depth => 1
                )
            );
    
        2
  •  6
  •   perigrin    16 年前

    也许Moose的首选方法是在属性上设置lazy_build:

    has 'mech' => (is => 'rw', isa => 'WWW::Mechanize', lazy_build => 1);
    sub _build_mech {
         warn("no Mech set for " . $self->urlspan->name);
         WWW::Mechanize->new(
               agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6)'.
                        ' Gecko/2009011913 Firefox/3.0.4',
               stack_depth => 1
         );
    }
    

    这将允许属性'mech'在第一次调用时填充,除非构造函数或访问器另有设置(因为它仍然是'rw')。

        3
  •  5
  •   ysth    16 年前

    虽然Perl多年来一直提供了以您尝试的方式使用属性的能力(通过所谓的左值subs),但这在最初的OO Perl版本中并不存在,人们几乎学会了不使用它。特别是因为实现验证有点棘手(而且效率不高)。

    你可以使用 MooseX::Meta::Attribute::Lvalue

    我建议只使用$self。>属性(“值”)样式。