Scala 如何在进程中断时终止控制台输入
我正在玩Scalaz流库,并试图创建一个简单的控制台应用程序 我遵循了教程,他们有一个控制台读写示例 但我面临着一个奇怪的问题,我不知道该如何解决 这是我的代码:Scala 如何在进程中断时终止控制台输入,scala,functional-programming,scalaz,scalaz-stream,Scala,Functional Programming,Scalaz,Scalaz Stream,我正在玩Scalaz流库,并试图创建一个简单的控制台应用程序 我遵循了教程,他们有一个控制台读写示例 但我面临着一个奇怪的问题,我不知道该如何解决 这是我的代码: import scala.concurrent.duration._ import scalaz.concurrent.Task object StreamApp extends App { (new StreamExec).go3 } class StreamExec { def gets: Task[String]
import scala.concurrent.duration._
import scalaz.concurrent.Task
object StreamApp extends App {
(new StreamExec).go3
}
class StreamExec {
def gets: Task[String] = Task {
scala.io.StdIn.readLine()
}
def puts(ln: String, answer: String): Task[Boolean] = Task {
println(ln)
ln.contains(answer)
}
def go3 {
import scalaz.stream.Process
val q = Seq("1", "2", "3") map { case p =>
println(s"Say $p")
val in = Process eval gets
val out = in flatMap { line =>
Process eval puts(line, p)
}
out.runLog.attemptRunFor(5.seconds)
}
println(q)
}
}
当我运行它时,输出如下所示
background log: info: Say 1
1
background log: info: 1
background log: info: Say 2
background log: info: Say 3
3
3
background log: info: 3
background log: info: List(\/-(Vector(true)), -\/(java.util.concurrent.TimeoutException), \/-(Vector(true)))
1正常,2在5秒后超时失败,然后3需要输入两次
问题是,当进程按时失败时,控制台输入没有被解除阻止(未终止),并且仍在等待用户的输入
我试图用期货来复制它,但也面临着同样的问题
谢谢。通常在scalaz流中,您获得(获取值),然后处理它并终止 在本例中,如果您的处理只是读取打印,则不需要运行日志,因此您只需要处理任意效果 我认为这个代码可能会有帮助
eval(gets)
.flatMap { name => Process(1,2,3).flatMap( ln => eval(puts(ln,name))) }
.take(3)
.run.run
您真正需要的是从Process1组合器中选择一个来引导您的进程,最终将终止您的程序。
您可以尝试使用各种组合器来构建您的程序