我有一个可以接收List [tuple3(foo,bar,fooby)]的函数,我意识到我想在使用List [tuple4(foo,bar,fooby,foobar)]时使用相同的函数。我想我可以对此使用模式匹配,但这会使代码重复。我该怎么办?
val tuple3List : List[(Foo, Bar, Fooby)] = List()
val tuple4List : List[(Foo, Bar, Fooby, Foobar)] = List()
myFunc(tuple3List)
myFunc(tuple4List)
def myFunc(tupleList : List[Foo, Bar, Fooby]) = {
}
答案 0 :(得分:3)
Tuple3
是Product3
的子类型,Tuple4
是Product4
...的子类型
Product3
,Product4
...是Product
的子类型。
因此您可以尝试
val tuple3List : List[(Foo, Bar, Fooby)] = List()
val tuple4List : List[(Foo, Bar, Fooby, Foobar)] = List()
myFunc(tuple3List)
myFunc(tuple4List)
def myFunc(tupleList : List[Product]) = {
// Do stuff
}
“具有不确定数目的元组的元组”的另一种替代方法可能是shapeless.HList。
答案 1 :(得分:2)
您可以使用Product
使其通用,但这会删除很多类型信息。由于类型擦除问题,您不能使用重载。
如果可能的话,最好使用类而不是元组,并使4元素版本成为3元素版本的子类:
trait myTrait { val a: Foo, val b: Bar, val c: Fooby }
case class Three(a: Foo, b: Bar, c: Fooby) extends myTrait
case class Four(a: Foo, b: Bar, c: Fooby, d: Foobar) extends myTrait
def myFunc(list: List[myTrait]) = ???
如果需要使用元组,可以使用 typeclass 来解决,但这是一个重量级的解决方案。