【发布时间】:2017-12-19 01:29:50
【问题描述】:
我很难理解 Scala Option, Some classes 的细微差别,希望你能帮助我。
据我从文档中了解到,当我们期望值是 A 类或 null 时,会使用 Option[A] 类型。虽然 Scala 中不存在 null 类型,但当我们与非缩放 API 对话时,可能会发生 null 场景。
示例 - 假设我有一个将字符串转换为整数值的函数
def strToInt(s: String): Option[Int] = {
val x: Option[Int] = try {
Some(s.toInt)
} catch {
case e: Exception => None
}
x
}
def stringToInteger(s: String): Int = {
Option(s) match {
case None => 0
case Some(s) => strToInt(s).getOrElse(0)
}
}
这里我有一个包装函数“StringToInteger”,它检查函数的输入参数是字符串还是空值。如果为 null,则返回默认整数值 0,否则尝试使用 'strToInt' 函数将字符串转换为整数。
但是,当 stringToInteger 的输入参数为空时,我似乎遇到了以下错误。
stringToInteger(null)
错误:Null 类型的表达式不适合隐式转换
这是对 Option 习语的错误使用吗?
这是我遇到相同错误的另一个示例。在这种情况下,我只是检查输入的整数参数是否为空。
def isIntNull(i: Int): Boolean = {
Option(i) match {
case None => true
case Some(i) => false
}
}
结果 -
isIntNull(123)
false
isIntNull(null)
Name: Unknown Error
Message: <console>:31: error: an expression of type Null is ineligible for implicit conversion
isIntNull(null)
【问题讨论】:
-
你使用的是什么版本的 Scala?
-
您的第二个函数也可以重写,而无需手动将参数包装到选项中...
def stringToInteger(s: String): Int = strToInt(s).getOrElse(0) -
您好,我使用的是 Scala 2.11。
-
我在运行您的代码时没有遇到您的错误。你确定
StringToInteger(上面有S)是你粘贴在这里的那个吗?
标签: scala user-defined-functions optional-parameters