scala – 通过插入()匹配参数列表已被弃用
我正在从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)) }
我能够通过将“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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |