如何解开Option [MyClassName]?

时间:2018-11-05 11:27:03

标签: scala protocol-buffers

我收到一个类型不匹配并出现以下错误:

Type mismatch, expected: Color, actual Option[Color]

我如何解开包装?

下面是更多详细信息

case class ColorDetail(
    color: Option[Color],
    shades: List[Shade]
)

....

colorToProtobuf(colorDetail.color)

....

def colorToProtobuf(c: Color): ColorMessage = {
  ...
}

2 个答案:

答案 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)

如果colorNone,这将失败。如果您还可以,请让它失败。如果要为其提供默认值(即,如果未提供颜色),则为.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值。

您可以继续在选项上使用mapfilter之类的方法,直到准备好处理不确定性为止。如果您使用containsexistsfold之类的方法来处理结果,则可能可以处理None情况而无需发明“默认”值。 / p>