有没有办法抑制调用方中对重载运算符的特定警告?
背景:我正在研究一个重载<=
的模块,>=
实现一种声明性域特定的alnguage。 无论这是否是一个好主意,这些运算符在无效上下文中使用时都会抛出"在无效上下文中无用使用"警告。 像这样:
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 ...
有没有办法只禁止对重载调用的警告,而调用方不必显式禁用"无效"警告?
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
我建议你重载<<=
运算符和>>=
运算符,因为编译器希望它们用于它们的副作用。或者,您可能更喜欢-=
和+=
。
您需要从重载子例程返回$self
,因为像这样的运算符的 LHS 设置为返回值,并且您不希望它更改。
我猜没有可能。我唯一的解决方案是:
- 更改您的接口
- 忍受此警告(您可以通过伪信号处理程序过滤它们
__WARN__
) -
使用奇怪的语法:
$bound>= 1 或 0;
我认为第一选择是最好的;)