是否需要告知Perl编译器不要优化具有忽略的返回值的离外功能调用



我正在编写新的perl 5模块class :: tiny :: dinny :: CondectainedAccessor,以检查当您触摸对象属性,通过设置或获取默认值时检查类型约束。我正在编写单元测试,并想运行后一种情况的登录器。但是,我担心Perl可能会优化我的登录器功能调用,因为丢弃了返回值。会吗?如果是这样,我可以告诉它不要吗?相应的行为记录了吗?如果答案像"不用担心"一样简单,那就足够了,但是对文档的引用将不胜感激:)

当我在Perl 5.26.2 x64 Cygwin上运行它时,以下MCVE成功了。但是,我不知道这是否可以保证,或者现在恰好起作用,可能有一天会改变。

use 5.006; use strict; use warnings; use Test::More; use Test::Exception;
dies_ok {   # One I know works
    my $obj = Klass->new;   # Default value of "attribute" is invalid
    diag $obj->accessor;    # Dies, because the default is invalid
} 'Bad default dies';
dies_ok {
    my $obj = Klass->new;
    $obj->accessor;         # <<< THE QUESTION --- Will this always run?
} 'Dies even without diag';
done_testing();
{   package Klass;
    sub new { my $class = shift; bless {@_}, $class }
    sub check { shift; die 'oops' if @_ and $_[0] eq 'bad' }
    sub default { 'bad' }
    sub accessor {
        my $self = shift;
        if(@_) { $self->check($_[0]); return $self->{attribute} = $_[0] }   # W
        elsif(exists $self->{attribute}) { return $self->{attribute} }      # R
        else {  
            # Request to read the attribute, but no value is assigned yet.
            # Use the default.
            $self->check($self->default);    # <<<---- What I want to exercise
            return $self->{attribute} = $self->default;
        }
    } #accessor()
} #Klass

这个问题涉及变量,但不是功能。Perlperf说,Perl将优化各种事情,但是除了()的型号功能外,我还不清楚什么。

在JavaScript中,我会说void obj.accessor();,然后我确定它会运行,但结果将被丢弃。但是,我不能使用undef $obj->accessor;来产生类似的效果。Can't modify non-lvalue subroutine call of &Klass::accessor

合法地汇编失败

perl永远不会优化sub呼叫,并且不应用任何语言优化副作用的子呼叫。

undef $obj->accessor的意思是类似于 $obj->accessor = undef

相关内容

  • 没有找到相关文章

最新更新