我正处于从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))
    }
插入()的参数列表的改编已被弃用:这不太可能是您想要的.签名:Right.apply [A,B](b:B):scala.util.Right [A,B]给定参数:改编后:右(():单位)
我可以通过将"true"case语句更改为:
case true => Right(()) //() is a shortcut to a Unit instance
这是解决此警告的正确方法吗?
编辑:也许是"为什么我们现在必须这样做"类型的答案是合适的,我粗略的调查似乎表明Scala在认为需要引起其他问题时插入"单元"
Gab*_*lla 68
scala 2.11中已经弃用了自动Unit推理,其背后的原因是它可能导致混乱的行为,特别是对于学习该语言的人.
这是一个例子
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,2,3).toSet.apply(())
这意味着:测试是否()属于该集合.既然情况并非如此,你会得到一个false!
因此,从scala 2.11开始,如果要将()(aka Unit)作为参数传递,则必须明确.这就是你必须写的原因:
Right(())
代替
Right()
来自简化Scala的例子- Simon Ochsenreither 的过去,现在和未来.
| 归档时间: | 
 | 
| 查看次数: | 5685 次 | 
| 最近记录: |