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

scala – 通过插入()匹配参数列表已被弃用

发布时间:2020-12-16 09:48:37 所属栏目:安全 来源:网络整理
导读:我正在从Scala 2.10.x升级到2.11.2的过程中,我收到以下警告与以下代码: override def validateKey(key: String): Either[InvalidKeyError,Unit] = keys.contains(key) match { case true = Right() case false = Left(InvalidKeyError(context,key)) } Ada
我正在从Scala 2.10.x升级到2.11.2的过程中,我收到以下警告与以下代码:

override def validateKey(key: String): Either[InvalidKeyError,Unit] = 
    keys.contains(key) match {
      case true => Right()
      case false => Left(InvalidKeyError(context,key))
    }

Adaptation of argument list by inserting () has been deprecated: this
is unlikely to be what you want. signature: Right.apply[A,B](b: B):
scala.util.Right[A,B] given arguments: after adaptation:
Right((): Unit)

我能够通过将“true”case语句更改为:

case true => Right(()) //() is a shortcut to a Unit instance

这是解决这个警告的正确方法吗?

编辑:也许一个“为什么我们必须这样做现在”类型的答案是适当的,我粗略的调查似乎表明,Scala插入“单位”,当它认为它需要引起其他问题

解决方法

自动单元推理已经在scala 2.11中被弃用,这背后的原因是它可能导致混乱的行为,特别是对于学习该语言的人。

这里有一个例子

class Foo[T](value: T)
val x = new Foo

这不应该编译,对不对?你正在调用没有参数的构造函数,其中一个是必需的。令人惊讶的是,直到scala 2.10.4这个编译正好,没有错误或警告。

这是因为编译器推断出一个Unit参数,所以它实际上替换了你的代码

val x = new Foo[Unit](()) // Foo[Unit]

因为新引入的警告消息说,这不太可能是你想要的。

另一个着名的例子是这个

scala> List(1,2,3).toSet()
// res1: Boolean = false

调用toSet()应该是一个编译时错误,因为toSet不接受参数,但是编译器迫切地试图使其编译,最终解释代码为

scala> List(1,3).toSet.apply(())

这意味着:test是否属于集合。因为不是这样,你得到一个假!

所以,从scala 2.11开始,你必须是显式的,如果你想传递()(aka单位)作为参数。这就是为什么你必须写:

Right(())

代替

Right()

例子取自Simplifying Scala — The Past,Present and Future由Simon Ochsenreither。

(编辑:李大同)

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

    推荐文章
      热点阅读