Автобокс Perl в сочетании с перегрузкой операторов не работает? - PullRequest
3 голосов
/ 28 февраля 2011

Я пытаюсь использовать как функцию автобокса Perl, так и функцию перегрузки операторов, и похоже, что они не работают в тандеме.

Возможно, мне не хватает некоторого нюанса о том, как правильно использовать перегрузку, или это некое странное девиантное поведение?

Пример кода:

#!/usr/bin/perl
use strict;
use warnings;

package overload_me;
use overload('+' => "overloaded_add");
sub overloaded_add{
    my ($me, $him) = @_;
    $me+$him+1;
}

use autobox NUMBER => 'overload_me';
my $autoboxing_test = 4->overloaded_add(5);
my $overloading_test = 4 + 5;
print "Autoboxing test: 4+5=$autoboxing_test 
Overloading test: 4+5=$overloading_test\n";

Тестовый вывод:

Autoboxing test: 4+5=10 Overloading test: 4+5=9

1 Ответ

6 голосов
/ 28 февраля 2011

Автобокс не заставляет 4 быть экземпляром overload_me.Это вызывает вызовы методов с 4 слева от них для вызова методов в overload_me.Это тонкое, но важное различие, потому что оно означает, что overload просто не применяется вообще.4 не является объектом и не принадлежит ни к одному классу.Это все равно просто 4, а когда вы вычисляете 4 + 5, это все равно просто 4 + 5.

С документы autobox :

Автобокс прозрачен: упакованные значения не благословляются в своем (определяемом пользователем) классе реализации (если только метод не решает дать такое благословение) - они просто используют его методы, как если бы они были.

...