我有以下内容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中是否有更好的方法来实现这种模式?
我不知道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)
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |