すべてではなく一部のクラス属性をチェックするコンテンツ


8

属性を持つクラスがあります。すべてではなく一部が定義されているかどうかを確認したいと思います。そう:

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
}

タイプAのオブジェクトにはタイプ文字列用のメソッド 'CALL-ME'がないため、これによりエラーが発生します。

クラスの属性の値を提供するイントロスペクションメソッドはありますか?

$x.^attributes それらの名前とタイプは与えられますが、値は与えられません。

属性値を提供しddたり、.perl提供したりする方法がいくつかあるに違いないと思います。


すべてのクラスのパブリック属性が読み取り/書き込みを意図している場合はis rw、クラスに特性を適用できます。
uzlxxxx

回答:


6

はい、と呼ばれていget_valueます。渡される属性のオブジェクトが必要です。例えば:

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
THX。クラス属性にget_valueのドキュメントが見つかりました。カプセル化に違反しているため、通常は使用しないでください。
Richard Hainsworth

確かに。ただし、変更される可能性のある内部構造を使用する必要なく、実際に内省できるのは良いことです。:-)
Elizabeth Mattijsen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.