【发布时间】:2020-11-30 03:21:42
【问题描述】:
如果这样的事情在 scala 中有意义的话:
object CaseClassUnion extends App {
case class HttpConfig(bindUrl: String, port: String)
case class DbConfig(url: String, usr: String, pass: String)
val combined: HttpConfig with DbConfig = ???
//HttpConfig("0.0.0.0", "21") ++ DbConfig("localhost", "root", "root")
//would be nice to have something like that
}
至少这样编译...有没有办法,可能使用宏魔法来实现给定实例的两个类的联合? 在 zio 中,我相信有类似的东西:
val live: ZLayer[ProfileConfiguration with Logging, Nothing, ApplicationConfiguration] =
ZLayer.fromServices[ProfileConfigurationModule.Service, Logger[String], Service] { (profileConfig, logger) => ???
我们将ProfileConfiguration with Logging 转换为ProfileConfigurationModule.Service, Logger[String] => Service 的函数
【问题讨论】:
-
你不能扩展案例类,它们should be final - 你想要做的是定义所有接口的两个特征,然后创建一个扩展这两个特征的单个案例类。 - 你不能神奇地混合两个值来得到一个交集类型,你也可以只使用一个元组。
-
Vanilla Scala 不支持两个案例类的产品。您可以将
HList用于这两种类型,然后产品类型将类似于val combined: HttpConfig :: DbConfig :: HNil = httpConfig :: dbConfig:: HNil。如果你想使用 vanilla Scala,你必须自己做样板并定义一个新的案例类。 -
@texasbruce,
(HttpConfig, DbConfig)是两个案例类的产物...(使用元组是不是一个好主意完全是另一回事) -
@LeviRamsey 我的意思是将两个案例类的产品组合成一个案例类
标签: scala types case-class