为什么可以在Raku类上修改只读数组属性,而另一方面,不能修改标量?
如何使@.baz成为“只读”?
class Boo {
has $.bar;
has @.baz;
};
my $boo = Boo.new;
$boo.baz = (1, 2); # works ... ?
say $boo.baz;
$boo.bar = 1; #fails ... expected我的拉古多版本:
This is Rakudo version 2020.05.1 built on MoarVM version 2020.05
implementing Raku 6.d.发布于 2020-09-24 04:00:08
baz属性是只读的。
问题是,baz属性是一个具有可变元素的Array。
当调用$boo.baz时,基本上会得到对数组的引用。
一旦您有了对数组的引用,您就可以对数组做任何通常可以做的事情。
say $boo.baz.VAR.name; # @!baz当分配给数组时,您真正要做的是告诉数组它将包含新的内容。
my @a = ('a','b','c');
say @a.WHICH; # Array|94070988080608
@a = (1, 2, 3);
say @a.WHICH; # Array|94070988080608注意,.WHICH没有改变。这是因为它仍然是同一个数组。它只是有新的内容。
当分配给公共数组属性时,也会发生完全相同的情况。
您不是要分配一个新数组,而是要更改现有数组。
变量的所有行为都不是变量的固有行为,而是由对象来处理。
在数组的情况下,处理分配的对象是Array。
最简单的修复方法就是重载自动生成的访问器方法。
class Boo {
has $.bar;
has @.baz;
method baz () { @!baz.List }
}如果您从未计划更改@!baz中的值,则可以将其作为列表本身。
class Boo {
has $.bar;
has @.baz is List;
}发布于 2020-10-07 15:18:43
我投票给了@BradGilbert建议的“is”版本.我尝试了默认设置,得到了一条很棒的错误消息:
===SORRY!=== Error while compiling ...
Defaults on compound attribute types not yet implemented. Sorry.
Workaround: Create/Adapt TWEAK method in class Boo, e.g:
method TWEAK() {
@!baz := (initial values) unless @!baz;
}https://stackoverflow.com/questions/64034523
复制相似问题