Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
节俭生成的scala中的模式匹配联合类型_Scala_Thrift - Fatal编程技术网

节俭生成的scala中的模式匹配联合类型

节俭生成的scala中的模式匹配联合类型,scala,thrift,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 myClas

想象一个节俭的联盟,比如:

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)
请注意,我没有实例化
MyBool
MyLong
,我只想将它们作为“类型”传递。也就是说,我没有做:

val myClass = MyClass("cool", thrift.MyUnion.MyBool(_))
我很好奇是否有一种方法可以使用节俭生成的Scala实现这一点。

您可以使用这样的方法:

scala> sealed trait MyUnion
defined trait
我的联盟

这是您的基类,然后使用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)

谢谢你看。这实际上是我目前的处理方式。然而,问题是,现在,为了向MyBool添加一个新的“类型”,需要将其添加到thrift和Scala中。我想做的是利用thrift生成的Scala,这样我只需将类型添加到thrift文件中,而不需要维护单独的特性。由于代码生成的方式,实际上没有办法做到这一点。您可以实现@alifirat建议的trait,也可以实现一个类型类来为您处理联合值。无论如何,如果你改变了你的储蓄联盟,你将不得不实施一些措施。