2009-12-07 9 views
8

Tengo una clase Moose con un atributo que es un ArrayRef (solo lectura) y es manipulado internamente por el objeto. Pero cuando alguien llama al método de acceso, quiero que devuelva una matriz (o lista), no una referencia. Esto no solo reduciría la cantidad de desreferenciaciones que el usuario de la clase tiene que hacer, sino que tampoco puede manipular accidentalmente la misma referencia que usa mi objeto.Atributo Moose ArrayRef devuelto como un Array

¿Cuál es la mejor manera de hacer esto? ¿Algún tipo de coacción?

Respuesta

17

Use Moose::Meta::Attribute::Native::Trait::Array y delegación, p. Ej.

handles => { my_array => 'elements' } 

(a través Doy en #moose)

auto_deref tiene el comportamiento indeseable de regresar todavía una referencia si se llama el descriptor de acceso en el contexto escalar.

+2

Los documentos para 'auto_deref' (en Moose git) lo hacen más claro ahora. – hdp

3

Utilice la opción auto_deref:

has my_field => (
    is => 'ro', isa => 'ArrayRef[Str]', 
    auto_deref => 1, 
    # rest of options... 
); 

Tenga en cuenta que a veces no se obtendrá una serie de vuelta cuando se utiliza el método de lector, dependiendo del contexto escalar o lista de la expresión. Hace un tiempo me encontré con una situación en la que tuve que traer explícitamente un contexto de matriz a la expresión para que funcione la desreferenciación. Agregaré un ejemplo si puedo encontrarla.

+1

Gracias, miré a través de los documentos, pero aparentemente algo obvio fue simplemente omitido por mis ojos :) – mpeters

Cuestiones relacionadas