Inhaltsprüfung einiger, nicht aller Klassenattribute

8

Ich habe eine Klasse mit Attributen. Ich möchte überprüfen, ob einige, aber nicht alle definiert sind. Damit:

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
}

Dies führt zu Fehlern, da ein Objekt vom Typ A keine Methode 'CALL-ME' für den Typ string hat.

Gibt es eine Introspektionsmethode, die mir die Werte von Attributen einer Klasse gibt?

$x.^attributes gibt mir ihre Namen und Typen, aber nicht ihre Werte.

Ich denke, es muss seitdem einen Weg geben ddoder .perlAttributwerte liefern - denke ich.

Richard Hainsworth
quelle
Wenn alle öffentlichen Attribute der Klasse zum Lesen / Schreiben bestimmt sind, können Sie das is rwMerkmal auf die Klasse anwenden .
Uzlxxxx

Antworten:

6

Ja, es heißt get_value. Es benötigt das Objekt des Attributs, das an es übergeben wird. Zum Beispiel:

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
quelle
2
Danke. Dokumentation von get_value im Klassenattribut gefunden. Es verletzt die Kapselung und sollte daher normalerweise nicht verwendet werden.
Richard Hainsworth
Tatsächlich. Aber es ist gut , dass Sie tatsächlich können introspect, ohne auf die Verwendung Einbauten zurückgreifen zu müssen, die sich ändern können. :-)
Elizabeth Mattijsen