Nội dung kiểm tra một số, không phải tất cả, thuộc tính lớp


8

Tôi có một lớp với các thuộc tính. Tôi muốn kiểm tra xem một số nhưng không phải tất cả được xác định. Vì thế:

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
}

Điều này sẽ gây ra lỗi vì một đối tượng loại A không có phương thức 'CALL-ME' cho chuỗi loại.

Có một phương thức hướng nội cung cấp cho tôi các giá trị thuộc tính của một lớp không?

$x.^attributes cho tôi tên và loại của họ, nhưng không phải là giá trị của họ.

Tôi nghĩ rằng phải có một số cách kể từ khi ddhoặc .perlcung cấp các giá trị thuộc tính - tôi nghĩ.


Nếu tất cả các thuộc tính công khai của lớp có nghĩa là đọc / ghi, bạn có thể áp dụng is rwđặc điểm này cho lớp.
uzlxxxx

Câu trả lời:


6

Vâng, nó được gọi là get_value. Nó cần đối tượng của thuộc tính được truyền cho nó. Ví dụ:

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
Cám ơn. Tìm thấy tài liệu của get_value trong Thuộc tính lớp. Nó vi phạm đóng gói, vì vậy thông thường không nên được sử dụng.
Richard Hainsworth

Thật. Nhưng thật tốt khi bạn thực sự có thể hướng nội, mà không cần phải sử dụng nội bộ có thể thay đổi. :-)
Elizabeth Mattijsen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.