[英]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.method
和method($object)
在語法上等價的事實)。
請注意,我們有上面的grep
因為您只想測試A
的一些方法。 但是,即使您想測試添加到A
的所有方法,您仍可能需要 grep 排除BUILDALL
,這是由$v.^methods(:local)
返回的。 我還沒有弄清楚這是故意的還是錯誤的(它看起來不像是本地方法),並且會感謝任何人對此的想法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.