Scala: Что-то как Опция (Некоторые, Ни один), но с тремя состояниями: Некоторые, Ни один, Неизвестный

Нет никакого независимого от платформы способа сделать это.

самая близкая вещь, которую можно сделать, состоит в том, чтобы выполнить код без оптимизации. Тем путем можно присоединить к процессу (использующий отладчик Visual C++ или GDB) и получить применимое отслеживание стека.

6
задан Alex Black 15 November 2009 в 17:23
поделиться

5 ответов

Вот реализация barebone-комплекта. Вы, вероятно, захотите посмотреть в исходном коде класса Option некоторые навороты:

package example

object App extends Application {
  val x: TriOption[String] = TriUnknown

  x match {
    case TriSome(s) => println("found: " + s)
    case TriNone => println("none")
    case TriUnknown => println("unknown")
  }
}

sealed abstract class TriOption[+A]
final case class TriSome[+A](x: A) extends TriOption[A]
final case object TriNone extends TriOption[Nothing]
final case object TriUnknown extends TriOption[Nothing]
13
ответ дан 8 December 2019 в 02:52
поделиться

Вы можете взять кое-что из Лифта: Коробка. Он имеет три состояния: Полный, Отказ и Пустой. Кроме того, Empty и Failure наследуются от EmptyBox.

5
ответ дан 8 December 2019 в 02:52
поделиться

Вы можете создать свой собственный, используя три возможности. Или, как и в случае с одним из типов вашего car.radioType, вы могли быть неизвестны, а затем использовать охранников на вашем чемодане, чтобы справиться с этим. Если вы катаетесь самостоятельно, вы также должны включить черту Product. У liftweb есть тип Box, который является опцией закрытия, которая позволяет запускать full, empty и erorr.

2
ответ дан 8 December 2019 в 02:52
поделиться

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

car.radioType match { 
   case null => 
   case None => 
   case Some(radioType : RadioType) => 
}
8
ответ дан 8 December 2019 в 02:52
поделиться

Вы можете использовать scala.Либо. Используйте Left для исключительного значения и Right для ожидаемого значения, которое в этом случае может быть опцией:

scala> type Result = Either[String, Option[String]]
defined type alias Result

scala> val hasValue: Result = Right(Some("pioneer"))
hasValue: Result = Right(Some(pioneer))

scala> val noValue: Result = Right(None)
noValue: Result = Right(None)

scala> val unknownValue = Left("unknown")
unknownValue: Left[java.lang.String,Nothing] = Left(unknown)
4
ответ дан 8 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: