为什么在使用粗箭头语法构建的散列变量之前添加类型会导致类型检查失败错误?

Why does adding a type before a hash variable that is being built with fat arrow syntax, lead to type check failed error?

Raku 是 gradual typing 语言。所以下面的代码:

my %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

等同于:

my Hash %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

但是报错:

Type check failed in assignment to %hash; expected Hash but got Rat (4.5)

为什么在使用粗箭头语法构建的散列变量前添加类型会导致类型检查失败错误?

当您说 my Hash %hash 时,您指定的 Hash 只会将 Hash 作为 。在您的示例中,您将 Rats 作为值放入散列中,而不是 Hashes。这就是错误消息试图告诉您的内容。

这样你的例子会更有意义:

my Numeric %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

其中您强制所有 Numeric

另一种写法是:

my %hash is Hash[Numeric] = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

第一种方式只是第二种方式的语法糖。

如果你想限制按键,也有两种方法:

my %hash is Hash[Numeric,Str] = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

会将键限制为 Str。请注意,默认情况下,类型是 Str(),又名:强制 任何东西到 Str,这是 not 相同.

更语法糖的方式是:

my Numeric %hash{Str} = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;

我认为, 更具可读性,因为很清楚按键的输入是什么。