gpt4 book ai didi

class - 为什么可以修改 Raku 类的只读数组属性?

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

为什么只读数组属性可以在 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.

最佳答案

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没有改变。那是因为它仍然是同一个数组。它只是有新的内容。
当您分配给公共(public)数组属性时,会发生完全相同的事情。
您不是在分配新数组,而是在更改现有数组。
变量的所有行为都不是变量固有的,而是由对象处理。
对于数组,处理赋值的对象是 Array .

最简单的解决方法是重载自动生成的访问器方法。
class Boo {
has $.bar;
has @.baz;

method baz () { @!baz.List }
}
如果您从不打算更改 @!baz 中的值,则可以将其设为 List 本身
class Boo {
has $.bar;
has @.baz is List;
}

关于class - 为什么可以修改 Raku 类的只读数组属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64034523/

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