从thrift生成的scala中匹配union类型的模式

时间:2017-03-21 07:54:52

标签: scala thrift

想象一下节俭的联盟,如:

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来做到这一点。

1 个答案:

答案 0 :(得分:0)

您可以使用ADT这样的内容:

scala> sealed trait MyUnion
defined trait

一个MyUnion

这是你的基类,然后用case对象扩展:

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)