小编use*_*829的帖子

raku 类型枚举不适用于自定义类型

Raku 类型枚举是否应该与自定义类型一起使用?尝试以下操作时出现编译错误:

role A { }
class B does A { }
class C does A { }
my A enum E ( b => B, c => C );
Run Code Online (Sandbox Code Playgroud)

结果是

无法在 Perl6::Metamodel::ParametricRoleGroupHOW 类型的对象上找到方法“mro”

和

class D { }
my D enum F ( b => D.new, c => D.new );
Run Code Online (Sandbox Code Playgroud)

结果是

无法在设置中为“Int”自动生成原型方法

或者这是否属于

不支持用于生成键值对的复杂表达式。

编辑

关于第一个例子 - 看起来 Raku 不喜欢角色作为类型约束。尝试时给出相同的错误,例如

my Rational enum G ( one => 1/1, two => 1/2 );
Run Code Online (Sandbox Code Playgroud)

至于我真正希望的是:

使用类型对象作为尚未实现的枚举的值。对不起。

enums typed raku

10
推荐指数
1
解决办法
106
查看次数

参数化角色的定义性约束

是否可以为参数化角色添加定义性约束?以下尝试:

\n
role R[::T] { }\nclass C {\n    method m ( R[Str]:D $a ) { }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:

\n
\n

参数声明中的类型名“D”无效。
\nat ... scrap.raku:4
\n-------> 方法 m ( R[Str]:D\xe2\x8f\x8f $a ) { }

\n
\n

并声明一个变量:

\n
role R[::T] { }\nclass S does R[Str] { }\nmy R[Str]:D $r = S.new;\n
Run Code Online (Sandbox Code Playgroud)\n

结果是:

\n
\n


我的\nat ... scrap.raku:8
\n------> 我的 R[Str]\xe2\x8f\x8f:D $r = S.new; 格式错误;

\n
\n

parameterized-types raku

10
推荐指数
1
解决办法
192
查看次数

角色约束变量不接受内联定义的派生角色

role R { }
role S does R { }
role T does S { }

my R $r0 = T; # compiles
my R $r1 = role U does R { }; # compiles
my R $r2 = role V does S { }; # compile error:
# Type check failed in assignment to $r2; expected R but got V (V)
Run Code Online (Sandbox Code Playgroud)

任务应该$r2可行吗?

目标是做类似的事情:

my R @r = (
    role W does S { ... },
    # etc. …
Run Code Online (Sandbox Code Playgroud)

raku

10
推荐指数
1
解决办法
93
查看次数

使用 Z=> 和变量而不是列表文字构造枚举

我想构造一个字符串类型的枚举。以下作品:

my Str enum E ( <a b c> Z=> 'one', 'two', 'three' );
E.kv.raku.say;
Run Code Online (Sandbox Code Playgroud)

(“c”、“三”、“a”、“一”、“b”、“二”).Seq

但是,尝试以下方法不会:

my Str @a = <a b c>;
my Str @b = <one two three>;
my Str enum F ( @a Z=> @b );
F.kv.raku.say;
Run Code Online (Sandbox Code Playgroud)

没有向枚举提供值(@a Z=> @b 需要声明为常量吗?)

这是不支持的吗?

Raku/roast 涵盖了枚举结构,E但我没有看到F.

出于好奇,我也尝试了一下:

my $a = <a b c>;
my $b = <one two three>;
my Str enum G ( $a<> Z=> $b<>.map( { .Str } ) );
G.kv.raku.say;
Run Code Online (Sandbox Code Playgroud)

("", …

enums raku

9
推荐指数
1
解决办法
139
查看次数

将返回类型限制为角色参数捕获的类型

Raku 中是否应执行以下操作:

my role R[::T] {
    has T $!a;
    method m ( T $v ) {
        $!a = $v;
    }
    method n ( --> T ) {
        $!a;
    }
}

my class C does R[Str] { }

my C $c = C.new;
$c.m: 'hello';
$c.n;
Run Code Online (Sandbox Code Playgroud)

运行上面的命令会出现错误:

返回值类型检查失败;期望 T 但得到 Str (“你好”)

我是否误解了参数化角色的工作原理?

roles parameterized-types raku

6
推荐指数
1
解决办法
101
查看次数

检查签名是否接受捕获从调用者中删除属性值

我有一个 java 称之为“bean”的类。我希望能够分阶段合并属性值,同时检查合并的任何内容是否与子方法 BUILD 签名相匹配:

    class A {
      has Int $.a;
      has Str $.b;
      submethod BUILD ( Int :$!a, Str :$!b ) { }
      my Signature $sig = ( A.^methods.grep: { .name eq 'BUILD' } )[0].signature;
      method fill-in ( *%args ) {
        say 'filling-in';
        my @args = %args.pairs;
        @args.unshift: self;
        say 'after unshift';
        self.raku.say;
        my Capture $arg-capture = @args.Capture;
        say 'after Capture';
        self.raku.say;
        unless $arg-capture ~~ $sig {
          warn '(warning)';
          return;
        }
        my Str $name;
        my %merged;
        say 'after check'; …
Run Code Online (Sandbox Code Playgroud)

raku

4
推荐指数
1
解决办法
93
查看次数

标签 统计

raku ×6

enums ×2

parameterized-types ×2

roles ×1

typed ×1