gpt4 book ai didi

raku - 绑定(bind)类型强制

转载 作者:行者123 更新时间:2023-12-04 02:33:13 24 4
gpt4 key购买 nike

我正在尝试在签名中使用类型强制。

如何修复 my Chars(Str) @a := 'hello'; 行以使此代码正常工作?

class Chars is Array {
submethod new(Str:D $s) {
nextwith(|$s.comb);
}
}

use MONKEY-TYPING;
augment class Str {
method Chars { Chars.new(self) }
}


say Chars.new("hello").raku;
say "hello".Chars.raku;

my Chars(Str) @a := 'hello';

@a.raku.say;

最佳答案

您还没有说出您实际要做什么,所以这个答案试图从字里行间中解读出来。幸运的是,它可能接近您想要的,或者至少具有教育意义,或者相距数英里。无论哪种方式,如果您通过评论和/或编辑您的答案来回应这个答案,我可能会使其更有用。

我对你所追求的事物的最佳猜测

以下似乎工作正常,但不暗示任何保证:

subset Char of Str where .chars <= 1;
say Char ~~ Str; # True

class Chars is Array[Char] { multi method new (Str:D $_) { samewith |.comb } }

my @a is Chars;

say @a.WHAT; # Chars

@a = Chars.new: 'foo';
say @a; # [f o o]
say @a.elems; # 3
say @a.of; # Char

@a = 'buzz'.comb;
say @a; # [b u z z]
say @a.elems; # 4

@a = '4', '2';
say @a; # [4 2]

@a[3] := '9';
say @a; # [4 2 (Char) 9]

@a[4] = '100'; # Type check failed in assignment to ;
# expected Char but got Str ("100")
use MONKEY-TYPING;
augment class Str { method Chars { Chars.new: self } }

my (Chars(Str) $a) := \'hello';
say WHAT $a; # Str
say $a; # [h e l l o]
$a[1..3] = 'bar'.comb;
say $a; # [h b a r o]
  • 我引入了一个Char子集来对应一个单一的字符串类型约束,并在是Array[Char] 在声明/定义 Chars class 时。

  • 我使用的是samewith,而不是nextwith。如果将其改回并运行我的代码,您就会明白为什么。

  • 类型检查错误消息很奇怪:“正在分配给 ;”。

  • 我的@a 是 Chars 是新 Chars永久编译时绑定(bind)>,以及相应的类型约束,到 symbol @a

从字面上回答你的问题

Binding with type coercion

我的 (Chars(Str) $a) := '1';说 $a.WHAT; #(字符)

I'm trying to use type coercion in a signature.

使用签名这个词意味着:

sub a (Chars(Str) $a) { $a }
say WHAT a '1'; # (Chars)

或者,更不可能:

my Chars $a;
:(Chars(Str) $a) := \'hello';

语法 :(...) 指定一个独立的签名。它们很少被使用,而且有点奇怪。例如,如果您绑定(bind)到一个独立的签名,那么其中的任何变量都必须存在于绑定(bind)发生的直接词法范围内。就像例程签名一样,它们绑定(bind)到 Capture。与调用例程时发生的例程签名绑定(bind)不同,编译器不会将 := 绑定(bind)的 RHS(相当于例程的参数)转换为 Capture 给你,所以你必须这样做,例如通过使用 \ 捕获操作符。

但我强烈怀疑这就是您所追求的。


如果您真的有兴趣在例程之外声明一个变量,那么可以使用list 声明语法(即使您只绑定(bind)到一个变量):

my (Chars(Str) $a) := \'hello';

额外的双亲有所不同。但是您仍然必须使用绑定(bind)和捕获。

奇怪的是(或者我只是太困了?),如果你尝试赋值,强制转换不会发生:

my (Chars(Str) $a) = \'hello';
say WHAT $a; # Str

How can I fix the my Chars(Str) @a := 'hello';?

如果您尝试这样做,您会看到如下错误消息:Coercion Foo(Bar) 的类型不足以限定变量

如果绑定(bind)到签名,则必须绑定(bind)Capture

您正在使用 @ 符号声明一个变量。这意味着其左侧的类型约束约束变量的元素,而不是整个变量本身。也就是说,像my Chars @a;这样的声明声明了一个Array[Chars]。鉴于我上面的代码,这将是一个 Array[Array[Char]],一个由单个字符元素组成的数组。我很确定你不是这个意思。

关于raku - 绑定(bind)类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62979456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com