Итерация по кортежу произвольной длины

Я только начал со Scala и столкнулся с проблемой:

Scala имеет типы Tuple1, Tuple2, …, Tuple22. Scalaquery возвращает кортежи при переборе запросов.

Теперь у меня есть заданный класс (ZK ListitemRenderer), который принимает Object и заполняет списки графического интерфейса строками, каждая из которых состоит из нескольких ячеек. Но ListitemRenderer не является общим. Итак, моя проблема в том, что у меня есть «данные» Object, которые на самом деле представляют собой кортеж произвольной длины, который я должен перебирать для создания ячеек (просто с data._1.toString, …).

Поскольку не существует я не знал супертипа для Tuple1-22, я не могу не мог просто сделать data.asInstanceOf[Tuple].productIterator foreach {…}

Что я могу сделать?


Ниже Ответ сказал мне, что у всех кортежей действительно есть черта — Product — обеспечивающая желаемую функцию foreach.


person flying sheep    schedule 24.05.2011    source источник


Ответы (1)


Все классы TupleX наследуются от Product, который определяет def productIterator : Iterator[Any]. Вы можете вызвать его для перебора всех элементов любого кортежа.

Например:

def toStringSeq(tuple: Product) = tuple.productIterator.map(_.toString).toIndexedSeq
person Jean-Philippe Pellet    schedule 24.05.2011
comment
@flyingShell: Это должно сработать, но вы можете ввести аргумент data вашей функции как Product вместо Any или AnyRef (я думаю, вы имеете в виду это, когда говорите Object). Это спасло бы вас от актерского состава. - person kassens; 25.05.2011
comment
как сказано в вопросе: функция, в которой я нахожусь, реализует функцию из неуниверсального интерфейса, поэтому я не могу изменить типизацию и должен выполнить приведение, за исключением того, что у Scala есть способ обезобразить интерфейс, чтобы он был универсальным. - person flying sheep; 25.05.2011