Как развернуть Option [MyClassName]? - PullRequest
0 голосов
/ 05 ноября 2018

Я получаю несоответствие типов со следующей ошибкой:

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 голосов
/ 05 ноября 2018

Описание значения как 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 без необходимости придумывать значение по умолчанию.

0 голосов
/ 05 ноября 2018

.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...