相关疑难解决方法(0)

意外的哈希扁平化

我正在寻找解释为什么这两个数据结构不相等:

$ perl6 -e 'use Test; is-deeply [ { a => "b" } ], [ { a => "b" }, ];'
not ok 1 -
# Failed test at -e line 1
# expected: $[{:a("b")},]
#      got: $[:a("b")]
Run Code Online (Sandbox Code Playgroud)

哈希和数组中的尾随逗号就像在P5中一样没有意义:

$ perl6 -e '[ 1 ].elems.say; [ 1, ].elems.say'
1
1
Run Code Online (Sandbox Code Playgroud)

但是如果没有它,Hash会以某种方式丢失并且变得扁平化为对数组:

$ perl6 -e '[ { a => "b", c => "d" } ].elems.say;'
2
Run Code Online (Sandbox Code Playgroud)

我怀疑一些Great List Refactor法律适用于此,但我想得到更详细的解释,以了解这种扁平化背后的逻辑.

hashmap perl6

7
推荐指数
1
解决办法
117
查看次数

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

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
查看次数

将角色混合成可调用角色

从理论上讲,您可以在运行时将角色混合到对象中.所以我试图用一个函数做到这一点:

my &random-f = -> $arg  { "Just $arg" };

say random-f("boo");

role Argable {
    method argh() {
        self.CALL-ME( "argh" );
    }
}

&random-f does Argable;

say random-f.argh;
Run Code Online (Sandbox Code Playgroud)

在角色中,我self用来引用已经定义的函数,并CALL-ME实际调用角色中的函数.但是,这会导致以下错误:

Too few positionals passed; expected 1 argument but got 0
in block <unit> at self-call-me.p6 line 5
Run Code Online (Sandbox Code Playgroud)

我真的不知道谁会期待一个论点.从理论上讲,它应该是CALL-ME功能,但谁知道.消除self.产量的不同错误:CALL-ME used at line 11.添加does CallableArgable(把自己回来之后)会导致同样的错误.可以这样做吗?怎么想?

mixins perl6

5
推荐指数
1
解决办法
71
查看次数

使用Iterable和Iterator角色实现可迭代的类

假设我们有以下组成角色的类Iterable

class Word-Char does Iterable {
    has @.words;

    method !pairize($item) {
        return $item => $item.chars;
    }

    method iterator( Word-Char:D: ) {
        @!words.map({self!pairize($_)}).rotor(1).iterator
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以Positional在对象构造期间将对象分配给变量,然后对该变量进行迭代:

my @words = Word-Char.new: words => <the sky is blue>;
.say for @words;
Run Code Online (Sandbox Code Playgroud)

输出:

(the => 3)
(sky => 3)
(is  => 2)
(blue => 4)
Run Code Online (Sandbox Code Playgroud)

但是,如果要传递对象该怎么办?我如何确保它仍然可迭代?:

my $w = Word-Char.new: words => <the sky is blue>;
sub f( $w ) {
    .say for $w
}
f($w);
Run Code Online (Sandbox Code Playgroud)

输出: …

iterator perl6 raku

5
推荐指数
1
解决办法
133
查看次数

标签 统计

perl6 ×4

iterator ×2

mixins ×2

hashmap ×1

raku ×1