我发现了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.
| 归档时间: |
|
| 查看次数: |
308 次 |
| 最近记录: |