在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模式匹配(几乎)与匹配模式匹配完全相同.

相关文章

共收录Twitter的14款开源软件,第1页Twitter的Emoji表情 Tw...
Java和Scala中关于==的区别Java:==比较两个变量本身的值,即...
本篇内容主要讲解“Scala怎么使用”,感兴趣的朋友不妨来看看...
这篇文章主要介绍“Scala是一种什么语言”,在日常操作中,相...
这篇文章主要介绍“Scala Trait怎么使用”,在日常操作中,相...
这篇文章主要介绍“Scala类型检查与模式匹配怎么使用”,在日...