相关疑难解决方法(0)

尝试分配给字符串+角色时,"无法分配给不可变值"

Iterable doc页面中的示例开始

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

my @a does DNA = 'GAATCC';
.say for @a; # OUTPUT: «G?A?A?T?C?C?» 
Run Code Online (Sandbox Code Playgroud)

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

my $a does DNA = 'GAATCC';
Run Code Online (Sandbox Code Playgroud)

但是失败了,有些令人困惑的"无法分配给不可变的价值".无需现场指派,所以我们可以这样做:

my $a = 'GAATCC';
$a does DNA;
.say for $a;
Run Code Online (Sandbox Code Playgroud)

这只是为了以后留下混合.但这只是打印字符串,而不关注Iterablemixin.让我们明确地调用它:

.say for $a.iterator;
Run Code Online (Sandbox Code Playgroud)

它确实和以前一样,只是它打印了值$a.iterator,而没有实际调用函数:

<anon|69>.new
Run Code Online (Sandbox Code Playgroud)

这看起来像是在另一个问题中发生的事情.基线问题是我不明白Iterable真正做了什么角色,以及foriterator在什么时候以及何时调用某个对象.任何的想法?

iterator mixins perl6

6
推荐指数
2
解决办法
205
查看次数

使用特征将代理应用于变量(不是属性)

这个问题与Apply a proxy using traits几乎重复。但是,这个问题涉及将代理应用于属性,我想对变量做同样的事情。从乔纳森的回答中,我明白我

需要安排将 Proxy 绑定到属性中,以便那里有一个 Proxy 而不是通常由类初始化逻辑创建的 Scalar 容器。

但是,即使在编译时,我似乎也无法成功绑定到 Variable:D。(包括 nqp::bind)。我将不胜感激任何指向正确方向的指针。

(理想情况下,我想支持使用带有赋值语法的变量/特征。在一个完美的世界中,我的语法如下:

my $thing is custom-proxy = 42;
Run Code Online (Sandbox Code Playgroud)

其结果将是$thing在代理内部容器化,而不是在标量中。但是,如果这不可能,我会满足于通过绑定来使用它:=

[编辑:建立在下面接受的答案的基础上,主要可以使用以下代码来做到这一点:


multi trait_mod:<is>(Variable \v, :$tom) {
    v.block.add_phaser(
        'ENTER',
        v.willdo(<-> $_ {
            $_ = Proxy.new:
                     STORE => -> $, $v { say "store $v" },
                     FETCH => { say "fetch!"; 42}
                }, 1))
}
Run Code Online (Sandbox Code Playgroud)

这适用于未初始化为不同值的state变量或调用函数而不是第一个的变量。

rakudo raku

6
推荐指数
2
解决办法
117
查看次数

有没有一种直接的方法来检查某个东西是否是 mixin?

Raku mixin有两种(或更多)性质,在同一个容器中组合多个值,或者值与角色。但是,据我所知,没有一种直接的方法可以检查不是由您创建的变量中的“混合性”。

这可能是个伎俩

my $foo = 3 but Stringy;
say $foo.^name ~~ /\+/;# OUTPUT: «?+??»
Run Code Online (Sandbox Code Playgroud)

但是我还缺少其他任何可以直接查找的属性吗?

mixins raku

5
推荐指数
2
解决办法
134
查看次数

标签 统计

mixins ×2

raku ×2

iterator ×1

perl6 ×1

rakudo ×1