からの入力を処理するstdin
とscanLeft
、結果の出力は常に最後の入力から1行遅れます。
io.Source.stdin
.getLines
.scanLeft("START:")((accu, line) => accu + " " + line)
.foreach(println(_))
結果(私の手動入力の前には>
):
> first
START:
> second
START: first
> third
START: first second
私が欲しい賢明な出力は次のとおりです。
> first
START: first
> second
START: first second
> third
START: first second third
ご覧のとおり、最初の入力行に続く出力には、最初の入力行の文字列がすでに含まれているはずです。
を使用してすでに試しました.scanLeft(...).drop(1).foreach(...)
が、これにより次の結果が得られます。
> first
> second
START: first
> third
START: first second
純粋なシードを正しく省略して、目的の結果を得るにはどうすればよいですか?
[更新]当分の間、AndreyTyukinの気の利いた回避策に満足しています。それを提案してくれてありがとう。
ただし、もちろん、scanLeft
シードを最初のアイテムとして次の反復チェーンに送信しない代替手段がある場合は、そのソリューションをお勧めします。
[更新]
ユーザーjwvhは私の目的を理解し、それに優れたソリューションを提供しました。彼らの提案を締めくくるために、私はそれらを累積コールバックに送る前に行を前処理する方法を探します。したがって、readLine
コマンドは累積コールバックでは呼び出されるべきではありませんが、追加できる別のチェーンリンクで呼び出されます。
あなたはとかなり似た何かを得ることができますStream.iterate()
の代わりに、scanLeft()
とStdIn.readLine
の代わりにstdin.getLines
。
def input = Stream.iterate("START:"){prev =>
val next = s"$prev ${io.StdIn.readLine}"
println(next)
next
}
aStream
は怠惰に評価されるので、それを実現するための何らかの手段が必要になります。
val inStr = input.takeWhile(! _.contains("quit")).last
START: one //after input "one"<return>
START: one two //after input "two"<return>
START: one two brit //after input "brit"<return>
START: one two brit quit //after input "quit"<return>
//inStr: String = START: one two brit
getLines
それが要件である場合、実際にはイテレータをあきらめる必要はありません。
def inItr = io.Source.stdin.getLines
def input = Stream.iterate("START:"){prev =>
val next = s"$prev ${inItr.next}"
println(next)
next
}
これがあなたのコメントに対応しているかどうかわからない。多くの場合、エラーが発生する可能性のある場所とその判別方法によって異なります。
Stream.iterate(document()){ doc =>
val line = io.StdIn.readLine //blocks here
.trim
.filterNot(_.isControl)
//other String or Char manipulations
doc.update(line)
/* at this point you have both input line and updated document to play with */
... //handle error and logging requirements
doc //for the next iteration
}
.update()
ソースドキュメントを変更し、何も返さない(returns Unit
)と仮定しました。これは、update()
メソッドの通常のシグネチャです。
これの多くはコールチェーン(_.method1.method2.
など)で実行できますが、それによって事態がさらに複雑になる場合があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加