a match {
    case Some(myType) => {
        // do things
    }
}

Вот мой код на Scala и нет

case None =>
case _ =>

Линия.

Мне нужно добавить эти строки по умолчанию? Или можно их пропустить?

0
J.Done 13 Мар 2018 в 10:41

2 ответа

Лучший ответ
a match {
  case Some(myVal) => // do something with myVal
}

Это будет скомпилировано с предупреждением ...

Предупреждение: совпадение может быть неполным.

... потому что компилятор знает, что a может иметь значение, которое не покрывается, и если это произойдет, этот код выдаст ошибку времени выполнения.

a match {
  case Some(myVal) => // do something with myVal
  case _ => // universal default; do something else
}

Это компилируется без предупреждения, поскольку предлагает универсальное значение по умолчанию.

a match {
  case Some(myVal) => // do something with myVal
  case None => // do something else
}

Это также компилируется без предупреждения, потому что компилятор достаточно умен, чтобы знать, что Option может иметь только два состояния: None и Some(value)

ПРИМЕЧАНИЕ. Все это, конечно, применимо, только если a является Option[_]. В противном случае case Some() и case None не имеют смысла и не будут компилироваться.

Да, и просто охватить все базы ...

a match {
  case Some(myVal) => // do something with myVal
  case None => // do something else
  case _ => // redundant; unreachable code
}
3
jwvh 13 Мар 2018 в 08:32

В его нынешнем виде код выдает MatchError, если a не равно Some[T]. Вы можете избежать этого, добавив универсальный случай

a match {
    case Some(myType) => {
        // do things
    }
    case _ =>
}

Это ничего не даст, если a имеет тип None или не является типом Option. Если вы знаете, что a - это Option, то использование foreach сделает то же самое, но более аккуратно.

a.foreach { myType =>
    // do some things
}

Примечание

Это будет соответствовать любому типу Option. Чтобы выбрать конкретный тип Option, вам необходимо указать внутренний тип Option

a match {
    case Some(i: Int) =>
        // Do something with an int
    case Some(s: String) =>
        // Do something with a string
    case _ =>
        // Handle error condition
}
1
Tim 13 Мар 2018 в 08:51