加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 19:21:19 所属栏目:安全 来源:网络整理
导读:我发现了 scala这个问题: https://issues.scala-lang.org/browse/SI-4939 似乎我们可以定义一个名称为数字的方法: scala object Foo { val 1 = 2 }defined module Foo 但我们无法援引它: scala Foo.1console:1: error: ';' expected but double literal f
我发现了 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模式匹配(几乎)与匹配模式匹配完全相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读