4

オーバーロードされた演算子の呼び出し元で特定の警告を抑制する手段はありますか?

背景:<=オーバーロードし>=、一種の宣言的なドメイン固有の言語を実装する モジュールを検討しています。それが良い考えであるかどうかは別として、これらの演算子は、無効なコンテキストで使用されると、「無効なコンテキストでの無用な使用」という警告をスローします。何かのようなもの:

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」警告を明示的に無効にすることなく、オーバーロードされた呼び出しだけの警告を抑制する方法はありますか?

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 演算子が使用されることを期待しているため、代わりに<<=and演算子をオーバーロードすることをお勧めします。あるいは、と>>=を好むかもしれません。-=+=

$selfこのような演算子の LHS は戻り値に設定されており、それを変更したくないため、オーバーロード サブルーチンから戻る必要があります。

于 2012-05-07T16:56:49.733 に答える
1

可能性はありません。私が持っている唯一の解決策は次のとおりです。

  • API を変更する
  • この警告を受け入れます (__WARN__疑似シグナル ハンドラを介してそれらをフィルタリングできます) 。
  • 奇妙な構文を使用します:

    $bound >= 1 または 0;

最初の選択がベストだと思います ;)

于 2012-05-07T15:06:05.903 に答える