4

有没有办法在调用者中为重载运算符抑制特定警告?

背景: 我正在研究一个重载<=>=实现一种声明性域特定语言的模块。不管这是否是一个好主意,这些运算符在 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 ...

有没有办法仅针对重载调用抑制警告,而调用者不必显式禁用“无效”警告?

4

3 回答 3

3

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
于 2012-05-07T16:14:08.113 回答
2

我建议您重载<<=and>>=运算符,因为编译器希望它们用于其副作用。或者,您可能更喜欢-=+=

您需要$self从重载子例程返回,因为像这样的运算符的 LHS 设置为返回值并且您不希望它更改。

于 2012-05-07T16:56:49.733 回答
1

没有可能,我。我唯一的解决方案是:

  • 改变你的 API
  • 忍受这个警告(你可以通过__WARN__伪信号处理程序过滤它们)
  • 使用奇怪的语法:

    $bound >= 1 或 0;

我认为第一选择是最好的;)

于 2012-05-07T15:06:05.903 回答