我收到一个类型不匹配并出现以下错误:
Type mismatch, expected: Color, actual Option[Color]
我如何解开包装?
下面是更多详细信息
case class ColorDetail(
color: Option[Color],
shades: List[Shade]
)
....
colorToProtobuf(colorDetail.color)
....
def colorToProtobuf(c: Color): ColorMessage = {
...
}
答案 0 :(得分:2)
.get
:
case class ColorDetail(
color: Option[Color],
shades: List[Shade]
)
val c = ColorDetail(Some(Color("Green")), List())
c.color // Some(Color(Green))
c.color.get // Color(Green)
如果color
是None
,这将失败。如果您还可以,请让它失败。如果要为其提供默认值(即,如果未提供颜色),则为.getOrElse(...)
:
case class ColorDetail(
color: Option[Color],
shades: List[Shade]
)
val c = ColorDetail(None, List())
c.color // None
c.color.getOrElse(Color("Blue")) // Color(Blue)
答案 1 :(得分:0)
将值描述为Option
意味着它可能存在或可能存在,并且您需要确定两种情况下的处理方法。如果您知道默认值,则可以使用getOrElse
,如其他答案中所述。但是您也可以通过执行保留Option
的操作来推迟此决定。
您可以这样做:
val pb: Option[ColorMessage] = colorDetail.color.map(colorToProtobuf)
这将处理Color
(如果存在),但不会导致错误(它将仅返回None
)
然后您可以做类似的事情
val colorMesssage = pb.getOrElse(defaultMessage)
以这种方式进行操作意味着您不需要默认的Color
值,而只需要默认的ColorMessage
值。
您可以继续在选项上使用map
,filter
之类的方法,直到准备好处理不确定性为止。如果您使用contains
,exists
或fold
之类的方法来处理结果,则可能可以处理None
情况而无需发明“默认”值。 / p>