微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在scala中发出`object Foo {val 1 = 2}`

我发现了 scala这个问题: 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,并且只能在该对象内调用.

该问题的解决方案是:不会修复

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐