如何标准化联合类型(T | Option[T])?

pme*_*pme 2 scala scala-3

我有以下内容case class

case class Example[T](
    obj: Option[T] | T = None,
)
Run Code Online (Sandbox Code Playgroud)

Example(myObject)这使我能够像而不是那样构建它Example(Some(myObject))

要使用 obj,我需要将其标准化为Option[T]

  lazy val maybeIn = obj match
    case o: Option[T] => o
    case o: T => Some(o)
Run Code Online (Sandbox Code Playgroud)

the type test for Option[T] cannot be checked at runtime

我尝试过TypeTest,但也收到警告 - 或者我发现的解决方案看起来非常复杂 - 请参阅/sf/answers/4872566401/

在Scala 3中是否有更好的方法来实现这种模式?

zig*_*tar 6

我不知道Scala3。但你可以简单地这样做:

case class Example[T](v: Option[T] = None)

object Example {
 def apply[T](t: T): Example[T] = Example(Some(t))
}

Run Code Online (Sandbox Code Playgroud)

关于 OP 的具体用例,也可以进行隐式转换:

import scala.language.implicitConversions

case class Optable[Out](value: Option[Out])

object Optable {
  implicit def fromOpt[T](o: Option[T]): Optable[T] = Optable(o)
  implicit def fromValue[T](v: T): Optable[T] = Optable(Some(v))
}

case class SomeOpts(i: Option[Int], s: Option[String])

object SomeOpts {
  def apply(i: Optable[Int], s: Optable[String]): SomeOpts = SomeOpts(i.value, s.value)
}

println(SomeOpts(15, Some("foo")))
Run Code Online (Sandbox Code Playgroud)

  • 考虑 API 最常见的用法:您不需要提供“apply”的所有可能变体。 (2认同)