【问题标题】:Pattern matching union type from thrift-generated scala来自节俭生成的 scala 的模式匹配联合类型
【发布时间】:2017-08-12 18:26:40
【问题描述】:

想象一个节俭的联合:

union MyUnion {
  1. bool myBool
  2. i64 myLong
  3. double myDouble
}(persisted='true')

我想要在 Scala 中做这样的事情:

case class MyClass(
  myString: String,
  myUnionType: ???
)

然后,我想像这样实例化这个类:

import ...{thriftscala => thrift}

val myClass = MyClass("cool", thrift.MyUnion.MyBool)
val myOtherClass = MyClass("wow", thrift.MyUnion.MyLong)

请注意,我没有实例化 MyBoolMyLong,我只是想将它们作为“类型”传递。即,我没有做:

val myClass = MyClass("cool", thrift.MyUnion.MyBool(_))

我很好奇是否有办法使用节俭生成的 Scala 来做到这一点。

【问题讨论】:

    标签: scala thrift


    【解决方案1】:

    您可以像这样使用ADT

    scala> sealed trait MyUnion
    defined trait
    

    我的联盟

    这是您的基类,然后使用案例对象进行扩展:

    scala> case object  MyBool extends MyUnion
    defined object MyBool
    
    scala> case object MyDouble extends MyUnion
    defined object MyDouble
    
    scala> case object MyLong extends MyUnion
    defined object MyLong
    
    scala> case class MyClass(str : String, union : MyUnion)
    defined class MyClass
    

    如何使用:

    scala> MyClass("cool", MyBool)
    res0: MyClass = MyClass(cool,MyBool)
    

    【讨论】:

    • 感谢您的浏览。这实际上是我目前处理它的方式。然而,问题是现在,为了向 MyBool 添加一个新的“类型”,需要将它添加到 thrift Scala 中。我想要做的是利用 thrift 生成的 Scala,所以我只需要将类型添加到 thrift 文件中,而无需维护单独的 trait。
    • 由于代码的生成方式,真的没有办法做到这一点。您可以按照@alifirat 的建议实现一个特征,或者您可以实现一个类型类来为您处理联合值。不管怎样,如果你改变你的旧工会,你将不得不实施 something
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2018-10-19
    • 2020-08-09
    • 2014-03-05
    • 2013-03-17
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多