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

che*_*nyf 6 hash raku

Raku 是渐进式打字语言。所以下面的代码:

my %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

是相同的:

my Hash %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

但是,它报告一个错误:

Type check failed in assignment to %hash; expected Hash but got Rat (4.5)
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*sen 8

当您说时my Hash %hash,您指定的Hash是仅Hash作为的a 。在您的示例中,您将Rats 作为值而不是 es 放入哈希中Hash。这就是错误消息试图告诉您的内容。

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

my Numeric %hash = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

您强制所有都为Numeric.

另一种写法是:

my %hash is Hash[Numeric] = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

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

如果您还想限制按键,还有两种方法可以实现:

my %hash is Hash[Numeric,Str] = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

会将键限制为Str. 请注意,默认情况下,类型是Str(),又名:将任何内容强制转换Str为,这是一样的。

更语法糖化的方式是:

my Numeric %hash{Str} = abc => 4.5, abd => 5.5, bcd => 6.4, bce => 3.6;
Run Code Online (Sandbox Code Playgroud)

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

  • 我曾经在 Scala 中编写这样的类型注释: `val map: Map[String, Double] = Map("abc" -> 4.5, "abd" -> 5.5, "bcd" -> 6.4, "bce" -> 3.6)`,当切换到 Raku 时我会感到困惑。谢谢你解开我的困惑! (2认同)
  • 添加了一些更多类似 Scala 的方式的解释。 (2认同)