Contenido que verifica algunos, no todos, los atributos de clase

8

Tengo una clase con atributos. Quiero verificar si algunos pero no todos están definidos. Entonces:

class A { 
    has $.a is rw;
    has $.b is rw;
    has $.c is rw;
    has $.d is rw;

    method delete { ... }
}

my A $x .= new(:a<hi>, :d<good>);

## later
$x.b = 'there';

## code in which $x.c may or may not be defined.

## now I want to check if the attributes a, b, and c are defined, without
## needing to know about d
my Bool $taint = False;
for <a b c> {
    $taint &&= $x.$_.defined
}

Esto causará errores porque un objeto de tipo A no tiene un método 'CALL-ME' para la cadena de tipo.

¿Existe un método de introspección que me dé los valores de los atributos de una clase?

$x.^attributes me da sus nombres y tipos, pero no sus valores.

Creo que debe haber alguna forma desde entonces ddo .perlproporcionar valores de atributo, creo.

Richard Hainsworth
fuente
Si todos los atributos públicos de la clase están destinados a ser de lectura / escritura, puede aplicar el is rwrasgo a la clase.
uzlxxxx

Respuestas:

6

Si, se llama get_value. Necesita que se le pase el objeto del atributo. Por ejemplo:

class A {
    has $.a = 42;
    has $.b = 666;
}
my $a = A.new;
for $a.^attributes -> $attr {
    say "$attr.name(): $attr.get_value($a)"
}
# $!a: 42
# $!b: 666
Elizabeth Mattijsen
fuente
2
Gracias. Se encontró documentación de get_value en Class Attribute. Viola la encapsulación, por lo que normalmente no debe usarse.
Richard Hainsworth
En efecto. Pero es bueno que realmente se pueda realizar una introspección, sin tener que recurrir al uso de elementos internos que pueden cambiar. :-)
Elizabeth Mattijsen