繁体   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