加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 抑制重载运算符的void上下文警告

发布时间:2020-12-16 06:22:49 所属栏目:大数据 来源:网络整理
导读:有没有办法在调用者中为重载运算符抑制特定警告? 背景:我正在查看一个重载 =和 =的模块,以实现一种声明性域特定的语言.无论这是否是一个好主意,这些运算符在void上下文中使用时会抛出“在void上下文中无用”警告.就像是: package Boundary;use strict;use
有没有办法在调用者中为重载运算符抑制特定警告?

背景:我正在查看一个重载< =和> =的模块,以实现一种声明性域特定的语言.无论这是否是一个好主意,这些运算符在void上下文中使用时会抛出“在void上下文中无用”警告.就像是:

package Boundary;

use strict;
use overload ('<=' => &;set_min,'>=' => &;set_max);

sub new     { my ($class,$min,$max) = @_; bless [ $min,$max ],$class; }
sub set_min { my $self = shift; $self->[0] = shift; }
sub set_max { my $self = shift; $self->[1] = shift; }

package main;

# user code
use warnings;

my $bound = Boundary->new();
$bound >=  1;  # Useless use of numeric ge (>=) in void context at ...
$bound <= 10;  # Useless use of numeric le (>=) in void context at ...

有没有办法抑制重载调用的警告,而调用者不必显式禁用’void’警告?

解决方法

Perl期望在重载运算符时保留现有的语义.例如它有时会优化否定.你正在玩火.

$perl -MO=Concise,-exec -e'$y = !$x;'
1  <0> enter
2  <;> nextstate(main 1 -e:1) v:{
3  <$> gvsv(*x) s
4  <1> not sK/1                    <--- "not" operator
5  <$> gvsv(*y) s
6  <2> sassign vKS/2
7  <@> leave[1 ref] vKP/REFC
-e syntax OK

$perl -MO=Concise,-exec -e'if (!$x) { f() }'
1  <0> enter 
2  <;> nextstate(main 3 -e:1) v:{
3  <$> gvsv(*x) s
4  <|> or(other->5) vK/1           <--- No "not" operator
5      <0> pushmark s
6      <$> gv(*f) s/EARLYCV
7      <1> entersub[t1] vKS/TARG,1
8  <@> leave[1 ref] vKP/REFC
-e syntax OK

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读