Options and Error Handling
Safe Lookup
Return a missing-safe result from a lookup.
safe-lookup
A lookup can return an `Option` instead of a raw value. The caller turns it into a status label and a safe default with `isDefined` and `getOrElse`.
Safe Lookup
SafeLookup.scala
Replay: real traced execution (multi-file project)
object Main {
def main(args: Array[String]): Unit = {
val key = "b"
var found: Option[Int] = None
if (key == "a") {
found = Some(10)
}
if (key == "b") {
found = Some(20)
}
val status = if (found.isDefined) "hit" else "miss"
val result = found.getOrElse(-1)
println("key=" + key)
println("status=" + status)
println("result=" + result)
}
}
object Main {
def main(args: Array[String]): Unit = {
val key = "a"
var found: Option[Int] = None
if (key == "a") {
found = Some(10)
}
if (key == "b") {
found = Some(20)
}
val status = if (found.isDefined) "hit" else "miss"
val result = found.getOrElse(-1)
println("key=" + key)
println("status=" + status)
println("result=" + result)
}
}
object Main {
def main(args: Array[String]): Unit = {
val key = "z"
var found: Option[Int] = None
if (key == "a") {
found = Some(10)
}
if (key == "b") {
found = Some(20)
}
val status = if (found.isDefined) "hit" else "miss"
val result = found.getOrElse(-1)
println("key=" + key)
println("status=" + status)
println("result=" + result)
}
}
key ← b, found ← None
1object Main {2 def main(args: Array[String]): Unit = {3 val key→ b = "b" //@key="a", "z"4 var found→ None: Option[Int] = None5 if (key == "a") {6 found = Some(10)found ← Some(20)
7}8if (keyb == "b") {9 found→ Some(20) = Some(20)10}status ← hit, result ← 20
12 val status→ hit = if (found.isDefinedtrue) "hit" else "miss"13 val result→ 20 = foundSome(20).getOrElse(-1)1415 println("key=" + keyb)16 println("status=" + statushit)17 println("result=" + result20)18 }19}outputkey=b status=hit result=20
key ← a, found ← None
1object Main {2 def main(args: Array[String]): Unit = {3 val key→ a = "a"4 var found→ None: Option[Int] = None5 if (key == "a") {6 found = Some(10)found ← Some(10)
4var found: Option[Int] = None5if (keya == "a") {6 found→ Some(10) = Some(10)7}8if (key == "b") {status ← hit, result ← 10
12 val status→ hit = if (found.isDefinedtrue) "hit" else "miss"13 val result→ 10 = foundSome(10).getOrElse(-1)1415 println("key=" + keya)16 println("status=" + statushit)17 println("result=" + result10)18 }19}outputkey=a status=hit result=10
key ← z, found ← None, status ← miss, result ← -1
1object Main {2 def main(args: Array[String]): Unit = {3 val key→ z = "z"4 var found→ None: Option[Int] = None5 if (key == "a") {6 found = Some(10)7 }8 if (key == "b") {9 found = Some(20)10 }1112 val status→ miss = if (found.isDefinedfalse) "hit" else "miss"13 val result→ -1 = foundNone.getOrElse(-1)1415 println("key=" + keyz)16 println("status=" + statusmiss)17 println("result=" + result-1)18 }19}outputkey=z status=miss result=-1