簡體   English   中英

如何間接訪問 class 的屬性

[英]How to access the attributes of a class indirectly

這與我的另一個問題相似但不完全相同: 內容檢查一些,不是全部,class 屬性

我正在編寫一個測試來驗證處理對 object 的影響。 但是我不知道如何獲取一組已知對象屬性的值,而是使用相同的代碼進行測試。 類似於以下內容(不起作用):

class A { has $.a, has $.b, has $.c };
my A $v .=new(:1a, :2b);

for <a b> { ok $v.{$_} > 0 }; # this does not work, but illustrates the intent.

如果我使用的是 Hash 而不是 object,那么很容易從 Hash 知道密鑰的情況下獲取值。

目前我能想到的就是測試每個屬性:

ok $v.a > 0;
ok $v.b > 0;

另外,我不想查看 object 的所有屬性,這是什么。^attributes 給了我,只是其中一些。

您遇到的問題 - 以及使用Hash es 比使用Class es 更容易進行此類測試的原因是,當您需要傳遞 object 時,您傳遞的是Str Hashe不會出現此問題,因為(默認情況下) Hash鍵已經字符串。

要記住的另一件重要的事情是,從技術上講,沒有任何方法可以從 object 外部直接訪問 Raku object 的屬性 – Raku 沒有公共屬性,只有可以從公共訪問器方法訪問的屬性. 這似乎是一種迂腐的區別,但在這里很重要:這意味着您需要一個可調用的Method object(它比我在上一段中提到的“對象”更具體)。

正如 Tyil 在評論中提到的,您可以使用for <a b> { ok $v."$_"() > 0 };的代碼讓 Raku dwym . 這樣做的原因是 final ()強制 Raku 將"$_"的內插值視為Callable ,在這種情況下表示Method

但是,我希望稍微更明確一些,並使用以下語法:

for $v.^methods.grep({.name ~~ 'a' | 'b'}) { ok $_($v) > 0}

(這利用了$object.methodmethod($object)在語法上等價的事實)。

請注意,我們有上面的grep因為您只想測試A的一些方法。 但是,即使您想測試添加到A的所有方法,您仍可能需要 grep 排除BUILDALL ,這是由$v.^methods(:local)返回的。 我還沒有弄清楚這是故意的還是錯誤的(它看起來不像是本地方法),並且會感謝任何人對此的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM