使用带有位移运算符的(+)裸字的作用是什么?

7

我正在学习Perl中级课程。现在我正在学习有关类对象引用的内容。其中他们提供了一个包。

{
    package Barn;

    sub new { bless [], shift }

    sub add { push @{ +shift }, shift }

    sub contents { @{ +shift } }

    sub DESTROY {
        my $self = shift;
        print "$self is being destroyed...\n";
        for ( $self->contents ) {
            print ' ', $_->name, " goes homeless.\n";
        }
    }
}

对于加号和位移运算符的工作,我还不理解。在文章中他们说,加号就像一个裸词,会被解释为一个软引用:@{"shift"}

你能否清楚地解释一下使用加号和位移运算符的工作原理?

1个回答

15

没有加号,@{shift}与数组@shift相同,它根本不调用shift运算符。添加加号强制对shift进行表达式求值,因此会调用shift运算符。

我更喜欢看到 @{ shift() }

通常编写方法以从$self提取第一个参数,像这样

sub new {
    my $class = shift;
    bless [ ], $class;
}

sub add {
    my $self = shift;
    push @$self, shift;
}

sub contents {
    my $self = shift;
    return @$self;
}

1
那么,加号会防止我们将移位运算符视为@shift数组吗? - b.sabarathinam saba
1
@saba:没错。它将其转换为表达式而不是字符串,因此调用shift运算符并使用其返回值。 - Borodin
1
@HåkonHægland:我无法强烈反对您使用找到的任何功能。内部宝石都在C源代码中,与此同时,您应该继续编写良好记录的Perl解决方案。 - Borodin
1
更准确地说,+ 防止 shift 成为一个裸字 - Brad Gilbert
1
是的,加上一个 + 会使解析器有所不同,并且你发布的其余内容都会随之发生。你发布的几乎让人觉得这是个错误或其他什么原因。 - Brad Gilbert
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接