学习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
真的有效, currentRace
和 team
?如果没有,那么你不应该做那些成员变量选项。不要只是让它们成为选项,因为理论上可以将它们分配给 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/