gpt4 book ai didi

scala - scala 中的问题 `object Foo { val 1 = 2 }`

转载 作者:行者123 更新时间:2023-12-04 10:11:25 24 4
gpt4 key购买 nike

我发现了这个问题:https://issues.scala-lang.org/browse/SI-4939

似乎我们可以定义一个名称为数字的方法:

scala> object Foo { val 1 = 2 }
defined module Foo

但我们不能调用它:
scala> Foo.1
<console>:1: error: ';' expected but double literal found.
Foo.1

我们可以在对象内部调用它:
scala> object O { val 1 = 1; def x = 1 }
defined module O
scala> O.x
res1: Int = 1

并且跟随将抛出错误:
scala> object O { val 1 = 2; def x = 1 }
defined module O
scala> O.x
scala.MatchError: 2
at O$.<init>(<console>:5)
at O$.<clinit>(<console>)
at .<init>(<console>:7)
at .<clinit>(<console>)
at RequestResult$.<init>(<console>:9)

我用 scalac -Xprint:typer查看代码 val 1 = 2部分是:
<synthetic> private[this] val x$1: Unit = (2: Int(2) @unchecked) match {
case 1 => ()
}

从中我们可以看到方法名改为 x$1 ,并且只能在该对象内部调用。

该问题的解决方案是: 无法修复

我想知道是否有任何理由允许数字作为方法的名称?在任何情况下我们需要使用“数字”方法吗?

最佳答案

这里没有绑定(bind)名称“1”。 val 1 = 2是一个模式匹配表达式,与 val (x,2) = (1,2) 的方式大致相同。绑定(bind) x为 1(如果第二个元素不相同,则会抛出 MatchError)。这是允许的,因为没有真正的理由添加特殊情况来禁止它;这边val模式匹配的工作方式(几乎)与 match 完全相同。模式匹配。

关于scala - scala 中的问题 `object Foo { val 1 = 2 }`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7176776/

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