[SPb-pm] [Moscow.pm] Работа оператора ||

Victor Efimov victor at vsespb.ru
Sat Nov 28 12:52:36 PST 2015


http://www.nntp.perl.org/group/perl.perl6.language/2000/08/msg1104.html

It would be nice to be able to say

     @a = @b || @c

instead of having to resort to

     @a = @b ? @b : @c

The reason that it is not currently possible is that C<@b> (or the list
expression in its place) has to be evaluated in scalar context to determine
whether to evaluate C<@c>, and that propagating context to C<@b> would
require reevaluating it, which might have undesirable side effects (instead
of C<@b>, it might be C<decrement_balance()>).


29 ноября 2015 г., 3:27 пользователь Eugen Konkov <kes-kes at yandex.ru> написал:
> Всем привет.
>
> Недавно работая с || наткнулся на то, что оператор возвращает не то, что предпологалось. Покопавшись в документации - нашел, что он работает именно так, а не так как ожидается:
>
>         @a = @b || @c;          # this is wrong
>         @a = scalar(@b) || @c;  # really meant this
>         @a = @b ? @b : @c;              # this works fine, though
>
> И мне кажется, что было бы намного лучше, если бы этот || работал наподобие:
> sub OR {
>    my( $left, $right ) = @_;
>
>    if( wantarray ) {
>        @result = $left->();                      # list
>        return @result if scalar @result;
>
>        return $right->();
>    }
>    else {
>        $result = $left->();                      # scalar
>        return $result if $result;
>
>        return $right->();
>    }
> }
>
>
> @l =  foo() OR bar(); # foo is called in list context
> $s =  foo() OR bar(); # foo is called in scalar context
>
> т.е. если || вызыван в списковом контексте, то левый операнд вычислять в  списковом и возвращать список,
> если || вызван в скалярном - соответственно левый операнд вычислять тоже в скалярном и возвращать скаляр.
>
> Что скажете: "жить" будет легче или нет?
>
> --
>  Eugen                          mailto:kes-kes at yandex.ru
>
> --
> Moscow.pm mailing list
> moscow-pm at pm.org | http://moscow.pm.org


More information about the Spb-pm mailing list