首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么可以修改Raku类上的只读数组属性?

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

Stack Overflow用户
提问于 2020-09-23 18:52:00
回答 2查看 164关注 0票数 9

为什么可以在Raku类上修改只读数组属性,而另一方面,不能修改标量?

如何使@.baz成为“只读”?

代码语言:javascript
复制
class Boo {
    has $.bar;
    has @.baz;
};

my $boo = Boo.new;

$boo.baz = (1, 2); # works ... ?
say $boo.baz;

$boo.bar = 1; #fails ... expected

我的拉古多版本:

代码语言:javascript
复制
This is Rakudo version 2020.05.1 built on MoarVM version 2020.05
implementing Raku 6.d.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-24 04:00:08

baz属性是只读的。

问题是,baz属性是一个具有可变元素的Array

当调用$boo.baz时,基本上会得到对数组的引用。

一旦您有了对数组的引用,您就可以对数组做任何通常可以做的事情。

代码语言:javascript
复制
say $boo.baz.VAR.name; # @!baz

当分配给数组时,您真正要做的是告诉数组它将包含新的内容。

代码语言:javascript
复制
my @a = ('a','b','c');
say @a.WHICH; # Array|94070988080608

@a = (1, 2, 3);
say @a.WHICH; # Array|94070988080608

注意,.WHICH没有改变。这是因为它仍然是同一个数组。它只是有新的内容。

当分配给公共数组属性时,也会发生完全相同的情况。

您不是要分配一个新数组,而是要更改现有数组。

变量的所有行为都不是变量的固有行为,而是由对象来处理。

在数组的情况下,处理分配的对象是Array

最简单的修复方法就是重载自动生成的访问器方法。

代码语言:javascript
复制
class Boo {
    has $.bar;
    has @.baz;

    method baz () { @!baz.List }
}

如果您从未计划更改@!baz中的值,则可以将其作为列表本身。

代码语言:javascript
复制
class Boo {
    has $.bar;
    has @.baz is List;
}
票数 8
EN

Stack Overflow用户

发布于 2020-10-07 15:18:43

我投票给了@BradGilbert建议的“is”版本.我尝试了默认设置,得到了一条很棒的错误消息:

代码语言:javascript
复制
===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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64034523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档