Ric*_*rth 6 attributes class raku
这与我的另一个问题类似,但又不完全相同:内容检查部分而非全部类属性
我正在编写一个测试来验证处理对对象的影响。但是我无法弄清楚如何获取一组已知对象属性的值,但使用相同的代码进行测试。类似于以下内容(不起作用):
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.
Run Code Online (Sandbox Code Playgroud)
如果我使用 Hash 而不是对象,那么很容易从知道键的 Hash 中获取值。
目前我能想到的就是测试每个属性:
ok $v.a > 0;
ok $v.b > 0;
Run Code Online (Sandbox Code Playgroud)
另外,我不想查看对象的所有属性,这是 .^attributes 给我的,只查看其中的一些。
您遇到的问题 - 使用Hashes进行此类测试比使用Classes更容易的原因是,您在Str需要传入对象时传入了 a 。这个问题不会出现在Hashes 因为(默认情况下),Hash键已经是字符串。
要记住的另一件重要事情是,从技术上讲,没有任何方法可以从对象外部直接访问 Raku 对象的属性——Raku 没有公共属性,只有可以从公共访问器方法访问的属性. 这似乎是一种迂腐的区别,但在这里很重要:这意味着您需要一个可调用Method对象(它比我在上一段中提到的“对象”更具体)。
正如 Tyil 在评论中提到的,您可以让 Raku 使用代码 dwym for <a b> { ok $v."$_"() > 0 };。这样做的原因是最终()迫使 Raku 将 的内插值"$_"视为 a Callable,在这种情况下意味着 a Method。
但是,我更愿意稍微明确一点并使用以下语法:
for $v.^methods.grep({.name ~~ 'a' | 'b'}) { ok $_($v) > 0}
Run Code Online (Sandbox Code Playgroud)
(这利用了$object.method和method($object)在语法上等价的事实)。
请注意,我们有grep上述内容是因为您只想测试 的某些A方法。但是,即使您想测试添加到 的所有方法A,您可能仍然需要 grep 来排除BUILDALL,它由 返回$v.^methods(:local)。我还没有弄清楚这是故意的还是一个错误(它看起来不像是一种本地方法),并且会感谢任何人对此的想法。
|   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           113 次  |  
        
|   最近记录:  |