Перегрузка операторов в perl

Предполагая, что у меня есть благословенные ссылки/объекты $a и $b, каждая из которых хранится внутри как хэш-ссылка и имеет:

$a->{_x}
$b->{_x}

можно ли перегрузить арифметические операции, поэтому, когда я сделаю это:

my $c = $a + $b;

У меня будет благословенная ссылка $c с $c->{_x} равным $a->{_x} + $b->{_x}??


person snoofkin    schedule 06.07.2012    source источник


Ответы (1)


arrow_upward
6
arrow_downward

Конечно. Просто используйте свой обычный конструктор для нового объекта желаемого класса в перегруженном подразделе для + и установите его значение в эту сумму (или что-то еще, что вы хотите).

Предполагая, что у вас есть конструктор new, который принимает начальное значение в качестве аргумента, это будет что-то вроде:

sub plus {
   my $self = shift;
   my $right = (shift or 0);
   return MySuperNumberObject->new($self->{_x} + $right);
};

use overload '+' => \+
person Oleg V. Volkov    schedule 06.07.2012
comment
Примечание. Этот способ перегрузки имеет побочный эффект, заключающийся в том, что в подклассах перегруженные методы, которые переопределены в подклассе, не будут вызываться; метод родителя будет вызываться всегда, независимо от того, переопределяет ли подкласс этот метод. Лучшим подходом будет use overload '+' => 'plus';. - person ATLief; 14.06.2021