Могу ли я контролировать значение объекта Moose при использовании в скалярном контексте? - PullRequest
4 голосов
/ 06 января 2012

Возможно ли (и целесообразно) изменить значение, которое объект Moose оценивает, в скалярном контексте.Например, если я сделаю

my $object = MyObject->new();
print $object;

Вместо печати что-то вроде:

MyObject=HASH(0x1fe9a64)

Могу ли я заставить его напечатать какую-нибудь другую пользовательскую строку?

Ответы [ 3 ]

6 голосов
/ 06 января 2012

Посмотрите на overload прагму. Я не думаю, что вы можете перегружать скалярный контекст, но попробуйте перегрузить строковое преобразование (которое обозначается "", , которое вы должны заключить в кавычки, став глупым '""', цитируя с помощью оператора q make это более читабельно).

#!/usr/bin/env perl

use strict;
use warnings;

package MyObject;

use Moose;

use overload 
  q("") => sub { return shift->val() };

has 'val' => ( isa => 'Str', is => 'rw', required => 1);

package main;

my $obj = MyObject->new( val => 'Hello' );

print $obj; # Hello
2 голосов
/ 22 января 2012

Следующее также может спасти вас от царапин на голове:

use namespace::autoclean;, который иногда упоминается / предлагается в отношении Moose, не совместим с use overload q("")....

Как правило, вы отбрасываете use namespace::autoclean;, а затем use overload q("")... работает нормально.

1 голос
/ 06 января 2012

Да, вы можете. Взгляните на перегрузку "".

Решить, разумно ли это решать вам 8)

...