怎么深入掌握Option, Some, 和 None?

alanwu 2009-10-12
我知道Some和None都是Option的子类,None定义为case object,也就是说在实际使用中就是对象而不是类,更像null。

看到过很多使用Option,Some,和None的例子,但我想知道如何深入掌握。
night_stalker 2009-10-12
Option 来源于 Maybe Monad,和可 null 对象的区别在于可以链式操作。

譬如使用可 null 对象往往要判断是否 null,写起来容易出错,
很多空指针异常的问题往往就出在这个判断不完全上面:
if(a != null && a.b != null) a.b.c 
else 100

为了效率往往还得写成
if(a != null) {
  val tmp = a.b
  if(tmp != null) tmp.c
  else 100
} else 100


上面两种写法虽不长,但一不小心就会弄错。而使用 Option 就可以:
a map (_.b) map (_.c) getOrElse 100


一定程度上保障了代码安全性。

Maybe Monad 讲起来就有点费解了 …… 没兴趣可无视。

模式匹配也为 Option 提供了便利,就算你忘了 get 函数,
还可以用下面的代码获取箱中的内容:
oa match {
  case Some(a) => ...
  case None => ...
}
RednaxelaFX 2009-10-13
说起Maybe,想起之前Matthew Podwysocki写的一篇:Much Ado About Monads – Maybe Edition。虽然不是用Scala来讲解,概念都一样,看看无妨
alanwu 2009-10-13
Great! Thank you!
我再消化一下整理一下
Global site tag (gtag.js) - Google Analytics