LINUX.ORG.RU

не работает перегрузка инфиксного оператора

 ,


0

2

Всем привет, вот пример:

package List::Custom;

use overload (
    '""' => sub { "«@{ $_[0] }»" },
    '-'  => sub { "не работает"  },
);

sub new { bless \@_, shift }

@x = new List::Custom qw( A B C );
@y = new List::Custom qw( D E );

print "@x @y \n"; # работает
print @x - @y; # 0 вместо "не работает"
Вот за что?

Deleted

Я бы поостерегся сохранять «благословленные» ссылки в нессылочные прееменные. Это затрудняет понимание кода, как минимум.

Возможно, что у тебя массив оказался в списковом контексте и потерял свой bless. Используй ссылки и не выпендривайся.

annulen ★★★★★
()

perldoc perldata

читать до просветления. потом смотреть на свою подпрограмму new. если что-то непонятно, то дальше читать перлдок.

anonymous
()
Ответ на: комментарий от annulen

Используй ссылки и не выпендривайся.

но ведь очень хочется! Как можно сделать? Обещаю никогда так не писать :-D

Deleted
()
Ответ на: комментарий от Deleted

анон выше как бы пытается тебе указать на разницу между скалярным и списковым контекстом. new возвращает результат bless --- «благословлённую» ссылку на переданный массив, то есть скаляр. Когда ты пытаешься присвоить скаляр массиву @x, скаляр переводится в списковый контекст, то есть в массив из одного элемента. Результат @x - @y --- разность длин этих массивов, то есть 0.

Тебе уже сказали, если так хочешь сделать «объектно ориентированную» обвязку для массивов, то и работай со ссылками на «объекты», как это делается почти во всех языках. Обрати внимание, что стандартные функции типа push/pop/shift/etc. давно работают со ссылками на массивы так же, как и с массивами, а значит будут работать и с твоими «благословлёнными» ссылками на них.

anonymous
()
Ответ на: комментарий от anonymous

если так хочешь сделать «объектно ориентированную» обвязку для массивов

другого способа перегрузить операторы нету ведь?

P.S. Так и сделал. Спасибо за объяснение.

Deleted
()
Ответ на: комментарий от anonymous

Обрати внимание, что стандартные функции типа push/pop/shift/etc. давно работают со ссылками на массивы так же, как и с массивами, а значит будут работать и с твоими «благословлёнными» ссылками на них.

perldoc -f pop

...«pop» can take a scalar EXPR, which must hold a reference to an unblessed array... This aspect of «pop» is considered highly experimental...

level1 ★★
()
Ответ на: комментарий от anonymous
sub new { bless \@_ }

my $x = new qw(a b c);

pop $x; ## ERROR: Not an unblessed ARRAY reference

Без разыменовывания не обойтись?

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.