gpt4 book ai didi

Scala 推理 : fail on 1 evaluation, 成功与中间 val

转载 作者:行者123 更新时间:2023-12-02 04:55:38 25 4
gpt4 key购买 nike

我是 scala 的初学者,不明白这里发生了什么:

给定:

val reverse:Option[MyObject] = ...

myObject.isNaire 返回 bool 值。

如果我这样做:

val v:Option[Boolean] =  reverse.map(_.isNaire)
val b:Boolean = v.getOrElse(false)

有效。

现在,如果我这样做:

val b:Boolean = reverse.map(_.isNaire).getOrElse(false)

编译失败,类型不匹配:找到 Any,需要 bool 值


编辑:感谢 Beryllium,通过创建 SSCCE,我找到了解释的开端。在第一个示例中,myObject 是一个 java 类,因此 isNaire 是一个 java.lang.Boolean。我认为隐式转换应该使这变得透明,所以仍然欢迎解释。

class Test(val naire:java.lang.Boolean)

class Other {
val testValue = Some(new Test(true))
def mysteriousCompilationError:Boolean = testValue.map(_.naire).getOrElse(false)
}

注意:ScalaCompiler 是 2.10.2

最佳答案

scala.Predef 中有一个从 java.lang.Booleanscala.Boolean 的隐式转换:

  implicit def Boolean2boolean(x: java.lang.Boolean): Boolean = x.booleanValue

所以在你的第一种情况下 val v:Option[Boolean] = reverse.map(_.isNaire) 编译器看到一个 java.lang.Boolean 并寻找范围内的隐式方法,将其转换为 scala.Boolean,它可以在 scala.Predef 中方便地找到。

在第二种情况下,testValue.map(_.naire).getOrElse(false),编译器按以下顺序执行操作:

  1. 选项[测试] => 选项[java.lang.Boolean]
  2. getOrElse[B >: A](default: => B): B 其中 Ajava.lang.BooleanBAny 因为 scala.Boolean 不是 >: java.lang.Boolean
  3. val b:Boolean,编译器无法找到从 Anyscala.Boolean
  4. 的隐式转换

解决这个问题的唯一方法是在映射操作期间告诉编译器使用从 scala.Predefjava.lang.Boolean 的隐式转换> 到 scala.Boolean:

def works:Boolean = testValue.map[Boolean](_.naire).getOrElse(false)

这是一个常见问题并且经常弹出,因为 map 后跟 getOrElse 非常方便。要在没有额外类型的情况下正确解决此问题,请在选项上使用 fold(变形):

def worksToo:Boolean = testValue.fold(false)(_.naire)

通过使用 fold,您可以获得一些额外的类型安全性,因为不会转换为普通类型。例如,您不能这样做:

def failsTypeCheck = testValue.fold("test")(_.naire)

虽然编译器对此没有问题:

def passesTypeCheck = testValue.map(_.naire).getOrElse("test")

关于Scala 推理 : fail on 1 evaluation, 成功与中间 val,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18045985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com