2011-08-29 7 views
10

Tengo una clase donde quiero aplicar sobrecarga de cadena en su atributo id. Sin embargo, Moose no permite la sobrecarga de cadenas en los accesores de atributos. Por ejemplo:¿Cuál es la mejor forma de sobrecargar cadenas en un acceso de atributo de Moose?

package Foo; 
use Moose; 
use overload '""' => \&id, fallback => 1; 
has 'id' => (
    is => 'ro', 
    isa => 'Int', 
    default => 5, 
); 

package main; 
my $foo = Foo->new; 
print "$foo\n"; 

Lo anterior dará un error:

You are overwriting a locally defined method (id) with an accessor at C:/perl/site/lib/Moose/Meta/Attribute.pm line 927 

He probado un par de opciones para evitar esto:

  1. Marcado idis => bare, y su sustitución con mi propio acceso: sub id {$_[0]->{id}}. Pero esto es solo un truco.

  2. Tener el supercargador de cadenas use otro método que simplemente delegue de nuevo a id: sub to_string {$_[0]->id}.

Me pregunto si alguien tiene una mejor manera de hacerlo.

Respuesta

7
use overload '""' => sub {shift->id}, fallback => 1; 

Funciona bien para mí.

+0

que es esencialmente la opción 2 de la pregunta en sintaxis más corta. No digo que sea malo, pero aún sería interesante saber por qué falla el primer enfoque de la pregunta. – musiKk

+0

La sintaxis más corta es ligeramente más limpia. Con el problema de 3 arg, creo que este debe ser el camino a seguir. – stevenl

5

Creo que está recibiendo un error porque \&id crea un marcador de posición para un sub que se definirá más adelante, porque Perl necesitará saber la dirección que ese subtendrá cuando esté definido para crear una referencia a él. Moose tiene sus propios controles para tratar de evitar la sobrescritura de los métodos que defina y le informe esto.

Desde Creo que lo que realmente quiere hacer es llamar al método id cuando el objeto se utiliza como una picadura de este modo:

use overload '""' => 'id', fallback => 1; 

Desde el overload documentation

Values specified as strings are interpreted as method names.

+0

No funciona. Todavía recibo un mensaje de error: 'No se puede asignar un valor a un descriptor de acceso de solo lectura en el lector Foo :: id (definido en la línea 4) línea 3 Foo :: id ('Foo = HASH (0x12ffa10)', undef , '') llamado at - línea 12' –

+0

@Hynek, parece que 'sobrecarga' es pasar parámetros al método, que Moose interpreta como un intento de establecer el atributo. Por lo tanto, deberá usar un intermediario secundario, como lo hizo en su respuesta. – cjm

+4

Veo que este error se debe a 'sobrecarga' siempre pasa 3 argumentos al método de [Sobrecarga - convenciones de llamada] (https://metacpan.org/module/overload#Calling-Conventions-and-Magic-Autogeneration) – stevenl

Cuestiones relacionadas