Scala - 使用默认值 None 映射?
Scala - Map with default value None?
给定
trait A
case class B extends A
trait C
我正在尝试实现类似于此的东西:
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => None)
这会导致类型不匹配:
expected: C=>Option[A], actual: C=>None.type
我听说 scala 期望 None 从 catch 子句返回,所以我尝试了非常难看的
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => try {
throw new RuntimeException()
Some(B())
} catch{ case _ => None}
)
但这(谢天谢地)也没有用:
type mismatch, expected: C=>Option[A], actual: C=>Option[B]
做我想做的事情的正确方法是什么?
None
是 Option[Nothing]
的实例。但是 Option
在其类型参数上是协变的,而 Nothing
是一切的子类型。
这意味着 None
是 Option[A]
的子类型。就这么说吧:
None: Option[A]
但类型推断通常可以为您完成。如果你提前创建函数,
val default = (c: C) => None
那么你会得到错误的 return 类型并需要指定它,但是 withDefaultValue
应该已经知道你的地图的类型。
给定
trait A
case class B extends A
trait C
我正在尝试实现类似于此的东西:
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => None)
这会导致类型不匹配:
expected: C=>Option[A], actual: C=>None.type
我听说 scala 期望 None 从 catch 子句返回,所以我尝试了非常难看的
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => try {
throw new RuntimeException()
Some(B())
} catch{ case _ => None}
)
但这(谢天谢地)也没有用:
type mismatch, expected: C=>Option[A], actual: C=>Option[B]
做我想做的事情的正确方法是什么?
None
是 Option[Nothing]
的实例。但是 Option
在其类型参数上是协变的,而 Nothing
是一切的子类型。
这意味着 None
是 Option[A]
的子类型。就这么说吧:
None: Option[A]
但类型推断通常可以为您完成。如果你提前创建函数,
val default = (c: C) => None
那么你会得到错误的 return 类型并需要指定它,但是 withDefaultValue
应该已经知道你的地图的类型。