iterator - "Cannot assign to immutable value"尝试分配给字符串+角色时

标签 iterator mixins raku

the example in the Iterable doc page 开头

role DNA does Iterable {
  method iterator(){ self.comb.iterator }
};

my @a does DNA = 'GAATCC';
.say for @a; # OUTPUT: «G␤A␤A␤T␤C␤C␤» 

我发现它使用 @ 声明很奇怪,所以我将其更改为声明字符串的自然方式,$:

my $a does DNA = 'GAATCC';

但是失败了,并出现了令人困惑的“无法分配给不可变值”。不需要当场分配,所以我们可以这样做:

my $a = 'GAATCC';
$a does DNA;
.say for $a;

这只是将混合留到以后进行。但这只是打印字符串,而不关注 Iterable mixin。让我们明确地调用它:

.say for $a.iterator;

它的作用和以前一样,只是打印 $a.iterator 的值,而不实际调用该函数:

<anon|69>.new

这看起来像 the same thing it's going on in this other question 。基本问题是我不明白 Iterable 真正的作用,以及 for 真正的作用以及它何时在某个对象上调用 iterator 。有什么想法吗?

最佳答案

我认为这条线的作用并不像你想象的那样:

my @a does DNA = 'GAATCC';

它与:

相同
my @a := [ 'GAATCC', ];
@a does DNA;

基本上,.comb 调用将数组强制转换为 Str,并将其拆分为字符。

<小时/>

如果您这样做:

my @a = 'GAATCC' but DNA;

与此基本相同

my @a := Seq.new(('GAATCC' but DNA).iterator).Array;

请注意,@ 变量存储的是Positional 值,而不是Iterable 值。

<小时/>

你想要的是

my $a = 'GAATCC' but DNA;

$a.map: &say;
<小时/>

如果您希望能够使用 for,则不能使用带有 $ 符号的变量

my \a = 'GAATCC' but DNA;

.say for a;
<小时/>

您可能需要向 DNA 添加 Seq list List 等方法。

role DNA does Iterable {
  method iterator(){
    self.comb.iterator
  }
  method Seq(){
    Seq.new: self.iterator
  }
  method list(){
    # self.Seq.list
    List.from-iterator: self.iterator
  }
}

my $a = 'GAATCC' but DNA;
.say for @$a;

关于iterator - "Cannot assign to immutable value"尝试分配给字符串+角色时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50590224/

相关文章:

css - Sass Mixin Modulo 无法正常工作

css - 将多个参数传递给单个 mixin 参数

regex - Raku Regex 捕获和修改 LFM 代码块

regex - 为什么 unicode 引号会出现在 perl6 中的正则表达式捕获周围?

raku - nativecast() 是否创建一个新容器?

rust - 如何在Rust中返回链式迭代器

C++:遍历泛型列表

arrays - 将二维标签数组转换为从标签到坐标的 map 的有效方法是什么?

c++ - 将值存储在结构 vector 的映射中

css - Mixin 属性作为另一个 mixin 的参数?