scala - 何时使用选项

标签 scala

学习Scala有一段时间了,并不能清楚地理解Option的用法。当我链接函数时,它可以帮助我避免空检查(根据 docs )。这对我来说很清楚:)

接下来,我看到 Option 可以作为开发人员的一种指示符,表明此处可能存在空值并且必须对其进行处理。这是真的吗?如果是,我应该尽可能使用 Option 吗?例如

class Racer {
    val car = new Car()
}

我有 Racer 类,并且我确定 car 字段不能为空(因为它是常量并且在我创建 Racer 实例时获得一个值)。这里不需要 Option。
class Racer {
    var car = new Car()
}

在这里,我这样做是为了让汽车可以改变。并且有人可以将 null 分配给 car。我应该在这里使用 Option 吗?如果是,我注意到我所有的类字段都是 Option 的候选者。我的代码看起来像这样
class Racer {
    var car: Option[Car] = None
    var currentRace: Option[Race] = None
    var team: Option[Team] = None
    ...
}

它看起来好吗?对我来说,这似乎是一种 Option 过度使用。
def foo(): Result = {
    if( something )
        new Result()
    else
        null
}

我有一个可以返回空值的方法。我应该返回 Option 吗?如果方法可以返回 null,我应该总是这样做吗?

任何关于它的想法都会有所帮助。提前致谢!

我的问题类似于 Why option但我认为这不一样。更多的是关于什么时候,而不是为什么。 :)

最佳答案

你应该避免 null尽可能多地使用 Scala。它实际上只是为了与 Java 的互操作性而存在。所以,而不是 null , 使用 Option只要函数或方法可能返回“无值”,或者当成员变量具有“无值”在逻辑上有效时。

关于您的Racer例如:是 Racer如果它没有 car 真的有效, currentRaceteam ?如果没有,那么你不应该做那些成员变量选项。不要只是让它们成为选项,因为理论上可以将它们分配给 null ;只有在逻辑上你认为它是有效的时才这样做 Racer对象,如果这些成员变量中的任何一个没有值。

换句话说,最好假装null不存在。 null的使用在 Scala 代码中是一种代码气味。

def foo(): Option[Result] = if (something) Some(new Result()) else None

请注意 Option有许多有用的方法可以使用。
val opt = foo()

// You can use pattern matching
opt match {
  case Some(result) => println("The result is: " + result)
  case None         => println("There was no result!")
}

// Or use for example foreach
opt foreach { result => println("The result is: " + result) }

另外,如果要以函数式风格进行编程,则应尽可能避免使用可变数据,即:避免使用 var , 使用 val相反,使用不可变集合并尽可能使您自己的类不可变。

关于scala - 何时使用选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9698391/

相关文章:

algorithm - 在 Scala 中编写 `indexBy` 的最佳方法是什么?

java - 具有多个变量的Scala for循环

scala - 为什么 Scala 2.11.2 会给我科学记数法 float 的编译错误?

scala - 如何为 Actor 生成唯一 ID?

scala - 如何合并/组合不同大小的元组列表

java - Scala 相当于 JavaScript 数组扩展

scala - 为什么在没有子类型证据的情况下,这个多函数案例的隐式推导会失败?

java - 如何从 Scala 中的 map 列表中获取所有值?

scala - 为什么用 Tuple0-22 和 Function0-22 而不是 HList

performance - Scala By-name 参数性能有多好?