我正在尝试做一些事情,以便在我的应用程序中完成过程时进行 2-3 分钟的beep
或sound
。 目前我有这个:
object SoundPlay {
import scala.collection.mutable.ListBuffer
val bb = new ListBuffer[Any]
def main(args: Array[String]) {
val beep = java.awt.Toolkit.getDefaultToolkit.beep
for (i <- 1 to 100) {
bb += beep
}
bb.foreach(println(_))
}
}
但是这个只发出一种声音,我不能让它重复萌比一次。?!
我的更新
我写了这个,是一种:
object SoundPlay {
def main(args: Array[String]) {
for(i <- 1 to 10) {
Thread.sleep(1000)
java.awt.Toolkit.getDefaultToolkit.beep()
}
}
}
beep
是一种令人讨厌的副作用方法。如果你想重复它,你必须通过类似 scalaz Task
的东西来捕获它:
import scalaz._, Scalaz._, concurrent.Task
val beepTask = Task(java.awt.Toolkit.getDefaultToolkit.beep)
//traverse so we gather the 100 Tasks into a single Task
val bb = (1 to 100).toList traverse {_ => beepTask}
//everything is "lazy" until we call run, that's when the beeps actually happen
bb.run
您将调用beep
的结果添加到Buffer
(即void
)。这意味着蜂鸣声作为副作用发出一次,并且无效结果存储在变量中。
您可能想要定义一个使用 lambda 表达式或(如以下代码中)部分应用 beep 函数调用 beep 的操作。
object SoundPlay {
import scala.collection.mutable.ListBuffer
import java.awt.Toolkit._
val bb = ListBuffer[() => Unit]() //a buffer of functions
def main(args: Array[String]) {
val beep = getDefaultToolkit.beep _ //this is a function with no arg
for (i <- 1 to 100) {
bb += beep
}
bb.foreach { case b =>
println(b())
Thread.sleep(500) // This pause is to hear the separate beeps
}
}
}