Scala:类似于Option(Some,None),但有三种状态:一些、无、未知

xzlaal3s  于 2022-11-29  发布在  Scala
关注(0)|答案(7)|浏览(218)

我需要返回值,当有人询问值时,告诉他们以下三件事之一:
1.这里是值
1.没有值
1.我们没有关于此值的信息(未知)
情况2与情况3有细微的不同。示例:

  1. val radio = car.radioType

1.我们知道它的价值:返回无线电类型,说“先锋”

  1. B.没有值:返回无
  2. c.我们缺少关于这辆车的数据,我们不知道它是否有收音机
    我想我可能会扩展scala的None并创建一个Unknown,但这似乎不可能。
    建议?
    谢谢!

更新日期:

理想情况下,我希望能够编写这样的代码:

  1. car.radioType match {
  2. case Unknown =>
  3. case None =>
  4. case Some(radioType : RadioType) =>
  5. }
0wi1tuuw

0wi1tuuw1#

下面是一个基本的实现。您可能希望查看Option类的源代码以了解一些附加功能:

  1. package example
  2. object App extends Application {
  3. val x: TriOption[String] = TriUnknown
  4. x match {
  5. case TriSome(s) => println("found: " + s)
  6. case TriNone => println("none")
  7. case TriUnknown => println("unknown")
  8. }
  9. }
  10. sealed abstract class TriOption[+A]
  11. final case class TriSome[+A](x: A) extends TriOption[A]
  12. final case object TriNone extends TriOption[Nothing]
  13. final case object TriUnknown extends TriOption[Nothing]
展开查看全部
r7knjye2

r7knjye22#

不要告诉任何人这是我的建议,但是你可以总是使用null来表示Unknown,而不是编写一个新的类。

  1. car.radioType match {
  2. case null =>
  3. case None =>
  4. case Some(radioType : RadioType) =>
  5. }
iqih9akk

iqih9akk3#

你可以从电梯里拿些东西:Box。它有三种状态:Full、Failure和Empty。此外,Empty和Failure都继承自EmptyBox。

o2gm4chl

o2gm4chl4#

可以使用scala.Either。使用Left表示例外值,使用Right表示期望值,在本例中,期望值可以是Option:

  1. scala> type Result = Either[String, Option[String]]
  2. defined type alias Result
  3. scala> val hasValue: Result = Right(Some("pioneer"))
  4. hasValue: Result = Right(Some(pioneer))
  5. scala> val noValue: Result = Right(None)
  6. noValue: Result = Right(None)
  7. scala> val unknownValue = Left("unknown")
  8. unknownValue: Left[java.lang.String,Nothing] = Left(unknown)
1rhkuytd

1rhkuytd5#

你可以用这三种可能性来创建你自己的。或者像你的一辆车一样。radioType类型你可以有未知的,然后在你的case上使用guards来处理它。如果你自己滚动,你应该也包括Product特性。liftweb有Box类型,这是一个选项close,允许full、empty和erorr发生。

v8wbuo2f

v8wbuo2f6#

我做了一些类似的分类3行类型在给定的文件中,一个给定的行可能,例如,Float为标题行,Long为中间行(行),或String为尾部行.也isHeaderisRowisTrailer可以用来知道哪一个是.希望有帮助:

  1. sealed abstract class HRT[+H, +R, +T] {
  2. val isHeader: Boolean
  3. val isRow: Boolean
  4. val isTrailer: Boolean
  5. }
  6. final case class Header[+H, +R, +T](h: H) extends HRT[H, R, T] {
  7. override val isHeader: Boolean = true
  8. override val isRow: Boolean = false
  9. override val isTrailer: Boolean = false
  10. }
  11. final case class Row[+H, +R, +T](r: R) extends HRT[H, R, T] {
  12. override val isHeader: Boolean = false
  13. override val isRow: Boolean = true
  14. override val isTrailer: Boolean = false
  15. }
  16. final case class Trailer[+H, +R, +T](t: T) extends HRT[H, R, T] {
  17. override val isHeader: Boolean = false
  18. override val isRow: Boolean = false
  19. override val isTrailer: Boolean = true
  20. }
  21. object Demo {
  22. def getEntries(): Seq[HRT[Float, Long, String]] =
  23. List(
  24. Header(3.14f),
  25. Row(42),
  26. Trailer("good bye")
  27. )
  28. val entries = getEntries()
  29. entries.foreach {
  30. case Header(f) => printf("header: %f\n", f)
  31. case Row(l) => printf("row: %d\n", l)
  32. case Trailer(s) => printf("trailer: %s\n", s)
  33. }
  34. }
展开查看全部
iugsix8n

iugsix8n7#

在Scala 3中,您可以像这样使用联合类型:

  1. object Unknown
  2. object Empty
  3. type MaybeRadio = RadioType | Empty.type | Unknown.type
  4. car.radioType match
  5. case Unknown => ???
  6. case Empty => ???
  7. case radioType: RadioType => ???

请参阅https://docs.scala-lang.org/scala3/book/types-union.html

相关问题