2012-05-07 3 views
4

Есть ли способ подавить определенные предупреждения в вызывающем абоненте для перегруженного оператора?Запретить предупреждение контекста void для перегруженного оператора

фона: Я смотрю на модуль, который перегружает <= и >= осуществить своего рода декларативный домена конкретного 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 ... 

Есть ли способ подавления предупреждений только для перегруженных вызовов, без вызывающего явного предупреждения отключить Пустоту?

ответ

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 
+0

+1 Спасибо, хорошая иллюстрация. Я не думаю, что это dangero - AAAUUGH IT BURNS !!! – pilcrow

+0

@pilcrow, Нет, вы правы, что вряд ли его скоро изменят. То, что вы столкнетесь с такими проблемами, потому что ваша модель и модель носителей не синхронизированы. – ikegami

1

Невозможно, я угадать. Единственное решение у меня есть:

  • изменить ваш API
  • жить с этими предупреждениями (вы можете фильтровать их с помощью обработчика сигналов __WARN__ псевды)
  • использования странного синтаксис:

    $ границы> = 1 или 0;

Я думаю, что первый выбор лучше;)

+0

Хм, я думал, что может быть грязный трюк, который можно было бы сыграть с '$ {^ WARNING_BITS}' – pilcrow

2

Я предлагаю вам перегружать <<= и >>= операторы вместо этого как компилятор ожидает, что они будут использоваться для их побочных эффектов. В качестве альтернативы вы можете предпочесть -= и +=.

Вам нужно будет вернуть $self из подпрограмм перегрузки, поскольку LHS такого оператора, как это, устанавливается в значение возврата, и вы не хотите, чтобы он менялся.

+0

+1 Интересное предложение. – pilcrow

+0

+1. Вы могли бы даже связать их: '($ bound >> = 1) << = 10;' (мне не нравится идея использования операторов для этого, но это было бы хорошим способом сделать это, если бы вы были использовать операторов.) – ikegami

Смежные вопросы