我有一个服务器的响应,我需要在(REPL)上进行模式匹配:
scala> val res = getResponse
res: Option[String] = Some(Some(9a/Fv8kifYPRfQNTTpke4XZiMGCLbbB))
scala> res.getClass
res11: Class[_ <: Option[String]] = class scala.Some
但我无法获得Some(Some(x))
的价值。当我说:
res.get
我收到java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String
或者:
scala> res.toString
res15: String = Some(Some(9a/Fv8kifYPRfQNTTpke4XZiMGCLbbBle0Gh73p3TIA=))
我可以说:
val a = res.asInstanceOf[Option[Option[String]]]
a.get.get // or a match { ... }
但如果res = None
会有异常,那会不会有什么?有更好,更优雅的方式吗?
答案 0 :(得分:1)
似乎你在getResponse
内的某个地方有错误的演员。结果类型为Option[String]
,但您确实得到Option[Option[String]]
。
scala> val x = Some(Some("test"))
x: Some[Some[String]] = Some(Some(test))
scala> val y = x.asInstanceOf[Option[String]]
y: Option[String] = Some(Some(test))
scala> y.get
java.lang.ClassCastException: scala.Some cannot be cast to java.lang.String
对于a.get.get
,您可以a.flatten
(它为您提供选项[字符串]),foreach
或map
。
scala> x.flatten
res0: Option[String] = Some(test)
scala> res0 foreach println
test
另外,请查看Option Cheat List