В Java у меня был такой метод.
public static void digPackageLines( List<PkgLine> pkgLineList, Tree treeParam ) {
if ( findPkgLineTreeExist( treeParam ) == false ) {
for ( Tree tree : findParents( treeParam ) ) {
digPackageLines( pkgLineList, tree );
}
} else {
for ( PkgLineTree pkgLineTree : findPkgLineTreeByTree( treeParam ) ) {
pkgLineList.add( pkgLineTree.pkgLineId );
}
}
}
Это займет список и изменит его, добавив pkgLines в этот список. Теперь в Scala это невозможно, поскольку все параметры имеют значения val и не могут быть изменены.
Это то, что я имею до сих пор.
def digPackageLines(pkgLineList : Seq[ PkgLine ], tree_id : Long) : Unit = {
if ( PkgLineTree.findPkgLineTreeExist(tree_id) == false ) { //tree is parent if no lines found
Tree.findParents(tree_id) map {
tree =>
digPackageLines(pkgLineList, tree.tree_id.get) //dig further into tree
}
} else { //found lines
PkgLineTree.findByTreeId(tree_id) map {
pkgLineTree =>
PkgLine.findById(pkgLineTree.pkg_line_id).get //add this line to pkgLineList somehow
}
}
}
Так что я застрял, что делать. Я смотрел учебники по хвостовой рекурсии, но они довольно простые и имеют дело только с числами. Нужно ли возвращать список из рекурсивной функции? У функций не может быть побочных эффектов, поэтому я предполагаю, что это единственный способ.
Другая моя основная проблема - добавление объектов в список. По-видимому, мне нужно иметь копию списка, а затем добавить объект к нему. Проблема в том, что я не могу создать новую переменную в цикле. Я уверен, что есть гораздо более простой способ. Спасибо за любую помощь.
** EDIT **
В самом конце я сделал это.
val pkgLineList : Seq[ (PkgLine, Tree) ] = User.findUserJoinAllAcl(10) flatMap {
user =>
PkgLine.digPackageLines(Vector[ (PkgLine, Tree) ](), user._2.tree_id)
}
Это выглядит правильно. Я изменил метод, чтобы вернуть кортеж. Единственная разница, хотя. Кажется, работает хорошо.