2011-05-24 50 views
10

我刚开始用Scala和遇到了一个问题:遍历任意长度的元组

Scala有各类Tuple1Tuple2,...,Tuple22。在迭代查询时,Scalaquery返回元组。

我现在有一个给定的类(ZK的ListitemRenderer),它接受Object s并用行填充gui列表,每个行包含一些单元格。但是ListitemRenderer不是通用的。所以我的问题是我有一个Object“数据”,它实际上是一个任意长度的元组,我必须迭代创建单元格(只需使用data._1.toString,...)。

由于没有我不知道超到Tuple1-22,我不能不能只是做data.asInstanceOf[Tuple].productIterator foreach {…}

我可以做什么?


回答以下告诉我,的确有性状的所有元组 - Product - 提供所需的foreach功能。

回答

17

全部TupleX类继承自Product,其定义了def productIterator : Iterator[Any]。你可以调用它遍历任何元组的所有元素。

例如:

def toStringSeq(tuple: Product) = tuple.productIterator.map(_.toString).toIndexedSeq 
+0

,所以我做'data.asInstanceOf [产品] .productIterator的foreach {...}'? – 2011-05-24 22:15:14

+0

@flying sheep:应该这样做,但是你可以将函数的'data'参数作为'Product'而不是'Any'或'AnyRef'输入(我想你的意思是说,当你说'Object'时) 。那会为你节省演员。 – kassens 2011-05-24 22:29:55

+0

正如问题中所说:函数我在从一个非泛型接口实现一个函数,所以我不能改变键入和必须强制转换,除了scala有一种方法来monkeypatch接口是通用的。 – 2011-05-25 09:27:20