Нет никакого независимого от платформы способа сделать это.
самая близкая вещь, которую можно сделать, состоит в том, чтобы выполнить код без оптимизации. Тем путем можно присоединить к процессу (использующий отладчик Visual C++ или GDB) и получить применимое отслеживание стека.
Вот реализация 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]
Вы можете взять кое-что из Лифта: Коробка. Он имеет три состояния: Полный, Отказ и Пустой. Кроме того, Empty и Failure наследуются от EmptyBox.
Вы можете создать свой собственный, используя три возможности. Или, как и в случае с одним из типов вашего car.radioType, вы могли быть неизвестны, а затем использовать охранников на вашем чемодане, чтобы справиться с этим. Если вы катаетесь самостоятельно, вы также должны включить черту Product. У liftweb есть тип Box, который является опцией закрытия, которая позволяет запускать full, empty и erorr.
Не говорите никому, что я предлагал это, но вы всегда можете использовать null для Unknown вместо того, чтобы писать новый класс.
car.radioType match {
case null =>
case None =>
case Some(radioType : RadioType) =>
}
Вы можете использовать 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)