興味深い質問です。
ここでの重要な問題は、繰り返しを通じて何らかの状態を保持する必要があることです。
これを行う 1 つの方法は、外部変数を使用することです (ここList#each
では、ファイル and の代わりに文字列の配列 and を使用していますFile#eachLine
が、類似している必要があります)。
def lines = [
"Single line.",
"Long \\",
"line \\",
"continuation.",
"Single line."
]
def processLine(line) { println "Processing \"$line\""}
def continuation = ''
lines.each { line ->
line = continuation + line
if (line.endsWith('\\')) {
continuation = line.take(line.size() - 1)
}
else {
processLine(line)
continuation = ''
}
}
別の方法は、次のように、相互作用を介して状態を運ぶように特別に設計されたイテレータを使用することですCollection#inject
。
lines = lines.inject([]) { list, line ->
if (list && list[-1].endsWith('\\'))
list[-1] = list[-1][0..-2] + line
else
list << line
list
}
lines.each { processLine(it) }
この場合、最初に継続行を結合してから処理します。
どちらの場合も、出力は次のとおりです。
Processing "Single line."
Processing "Long line continuation."
Processing "Single line."