Conteúdo verificando alguns, não todos, atributos de classe

8

Eu tenho uma classe com atributos. Quero verificar se alguns, mas nem todos, estão definidos. Assim:

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
}

Isso causará erros porque um objeto do tipo A não possui o método 'CALL-ME' para o tipo string.

Existe um método de introspecção que me fornece os valores dos atributos de uma classe?

$x.^attributes me dá seus nomes e tipos, mas não seus valores.

Eu acho que deve haver alguma maneira desde ddou .perlfornecer valores de atributo - eu acho.

Richard Hainsworth
fonte
Se todos os atributos públicos da classe forem de leitura / gravação, você poderá aplicar a is rwcaracterística à classe.
uzlxxxx

Respostas:

6

Sim, é chamado get_value. Ele precisa do objeto do atributo passado para ele. Por exemplo:

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
fonte
2
Valeu. Documentação encontrada de get_value no atributo de classe. Ele viola o encapsulamento, portanto, normalmente não deve ser usado.
Richard Hainsworth
De fato. Mas é bom que você possa realmente introspectar, sem ter que recorrer ao uso de componentes internos que podem mudar. :-)
Elizabeth Mattijsen