당신은 항상 (꼬리) 재귀 함수 *
def parseLines(
in: Iterator[String],
thisSection: List[String] = Nil,
results: List[Foo] = Nil
): List[Foo] = {
if (!in.hasNext) results.reverse
else in.next match {
case "SECTION END" =>
val section = thisSection.reverse.drop(1)
// Do something with data
val foo = // whatever you need to store from this section
parseLines(in, Nil, foo :: results)
case s =>
parseLines(in, s :: thisSection, results)
}
}
를 작성하여 이러한 종류의 문제점을 해결할 수 있지만,이 가변 변수를 사용하는 것보다 이렇게하는 것이 더 나은 아니다. 핵심은 변경 가능성있는 상태가 누출되어 프로그램의 나머지 부분에서 논리를 복잡하게 만들지 않도록 변경 가능성을 잘 지키는 것입니다. 누산기 변수를 재귀 적으로 만드는 대신에 이와 같은 메소드 안에 추가하는 것은 완벽합니다. 논리가 더 명확 해 지도록 선택하십시오.
* 꼬리 재귀가 더 좋거나 스택이 오버플로되는 것이 좋습니다. 확인하려면 @tailrec
주석을 사용하십시오.