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

Fre*_*ind 7 methods scala

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

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

scala> object Foo { val 1 = 2 }
defined module Foo
Run Code Online (Sandbox Code Playgroud)

但我们无法援引它:

scala> Foo.1
<console>:1: error: ';' expected but double literal found.
       Foo.1
Run Code Online (Sandbox Code Playgroud)

我们可以在对象中调用它:

scala> object O { val 1 = 1; def x = 1 }
defined module O
scala> O.x
res1: Int = 1
Run Code Online (Sandbox Code Playgroud)

以下将抛出错误:

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)
Run Code Online (Sandbox Code Playgroud)

我用scalac -Xprint:typer来看代码,val 1 = 2部分是:

<synthetic> private[this] val x$1: Unit = (2: Int(2) @unchecked) match {
    case 1 => ()
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

RM.*_*RM. 10

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