gpt4 book ai didi

class - 如何间接访问类的属性

转载 作者:行者123 更新时间:2023-12-03 14:22:10 24 4
gpt4 key购买 nike

这与我的另一个问题相似但不完全相同:Content checking some, not all, class attributes
我正在编写一个测试来验证处理对对象的影响。但我不知道如何获取一组已知对象属性的值,而是使用相同的代码进行测试。类似于以下内容(不起作用):

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.
如果我使用哈希而不是对象,那么很容易从哈希中获取值,知道键。
目前我能想到的就是测试每个属性:
ok $v.a > 0;
ok $v.b > 0;
另外,我不想查看对象的所有属性,这是 .^attributes 给我的,只是其中的一些。

最佳答案

您遇到的问题 - 以及使用 Hash 进行此类测试的原因与 Class 相比es – 你是在传递一个 Str当你需要传入一个对象时。 Hashe 没有出现此问题s 因为(默认),Hash键已经是字符串。
要记住的另一件重要的事情是,从技术上讲,没有任何方法可以从对象外部直接访问 Raku 对象的属性 - Raku 没有公共(public)属性,只有您可以从公共(public)访问器方法访问的属性.这似乎是一种迂腐的区别,但在这里很重要:这意味着您需要一个可调用的 Method对象(这比我在上一段中提到的“对象”更具体)。
正如 Tyil 在评论中提到的,您可以使用代码 for <a b> { ok $v."$_"() > 0 }; 让 Raku 进入 dwym。 .这样做的原因是最终的 ()强制 Raku 处理 "$_" 的插值作为 Callable ,在这种情况下意味着 Method .
但是,我希望稍微更明确一些,并使用以下语法:

for $v.^methods.grep({.name ~~ 'a' | 'b'}) { ok $_($v) > 0}
(这利用了 $object.methodmethod($object) 在语法上等价的事实)。
请注意,我们有 grep上面是因为您只想测试 A 的一部分的方法。然而,即使你想测试你添加到 A 的所有方法。 ,您可能仍需要 grep 来排除 BUILDALL ,由 $v.^methods(:local) 返回.我还没有弄清楚这是故意的还是错误的(它似乎不是本地方法),并且会感谢任何人对此的想法。

关于class - 如何间接访问类的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63339495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com