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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.