Moose:对象数组 - 通过属性>循环



我是Perl Moose的新手,我正在尝试实现这一简单任务。我定义了我的驼鹿类" testObject":

package TestObject;
use Moose;
use namespace::autoclean;
has 'Identifier' => (is =>'ro',isa=>'Str');
around BUILDARGS => sub
{
    my $orig = shift;
    my $class = shift;
    if ( @_ == 1 && ! ref $_[0] ) {
        return $class->$orig(Identifier => $_[0]);
    }
    else {
        return $class->$orig(@_);
    }
};
__PACKAGE__->meta->make_immutable;
1;

在另一个脚本中,我试图直接从" testobjects"数组中访问属性"标识符":

use TestObject;
use experimental 'smartmatch';
my @aArray1=(TestObject->new("z003"),TestObject->new("t302"),TestObject->new("r002"));
my $sIdent="t302";
if($sIdent~~@aArray1->Identifier)
{
    print "Element with Identifier".$sIdent." found.";
}

这不起作用。我可以这样实施这样的解决方法:

my @aIdent=();
foreach my $sObject(@aArray1)
{
    push(@aIdent,$sObject->Identifier);
}
if($sIdent~~@aIdent)
{
    print "Element with Identifier".$sIdent." found.";
}

,但这似乎不是最优雅的解决方案。解决此问题的最优雅解决方案是什么?

不要使用SmartMatch Operator进行此操作。它是有原因的,它可能会从未来的perl版本中删除,或者像以前这样更改其工作方式。

相反,这可以通过简单的grep来实现。

my @aArray1 = ( 
    TestObject->new("z003"), 
    TestObject->new("t302"),
    TestObject->new("r002"),
);
my $sIdent = "t302";
if ( grep { $_->Identifier eq $sIdent } @aArray1 ) {
    print "Element with Identifier" . $sIdent . " found.";
}

如果您希望它要短一些,也可以从list :: util使用first。这会更快一些,因为它将停止关注第一场比赛。

use List::Util 'first';
my @aArray1 = ( 
    TestObject->new("z003"), 
    TestObject->new("t302"),
    TestObject->new("r002"),
);
my $sIdent = "t302";
if ( first { $_->Identifier eq $sIdent } @aArray1 ) {
    print "Element with Identifier" . $sIdent . " found.";
}

关于您的代码的几句建议:

  • 永远不要用 object 命名类。它会让您感到困惑,未来,您和维护人员。如果您不了解 class object 之间的区别,请阅读。
  • Perl中的变量名称和功能始终按照惯例写在较低的情况下,我们使用Snake情况。骆驼盒保留给包装名称。

最新更新