Scala - 播放声音 - 播放

时间:2014-12-01 12:31:02

标签: scala audio beep

我尝试做一些事情,以便在我的应用程序中完成进程后,有beepsound 2-3分钟。目前我有这个:

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(_))

  }
}

但是这个只发出一个声音,我不能让它重复moe而不是一次。?!

我的更新

我写了这个并且是一种:

object SoundPlay {
def main(args: Array[String]) {
   for(i <- 1 to 10) {
     Thread.sleep(1000)
     java.awt.Toolkit.getDefaultToolkit.beep()
    }
  }
 }

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您正在添加Buffer调用beepvoid)的结果。 这意味着蜂鸣声作为副作用产生一次,而void结果存储在变量中。

您可能希望使用 lambda表达式或(如下面的代码中)partially applying蜂鸣声函数定义一个调用蜂鸣声的动作。

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
    }   

  }
}