Scala-播放声音-哔哔声

Scala-播放声音-哔哔声,scala,audio,beep,Scala,Audio,Beep,我正在尝试做一些事情,以便在我的应用程序中完成某个过程时发出嘟嘟声或声音,持续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

我正在尝试做一些事情,以便在我的应用程序中完成某个过程时发出
嘟嘟声
声音
,持续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(_))

  }
}
对象声音播放{
导入scala.collection.mutable.ListBuffer
val bb=新的ListBuffer[任何]
def main(参数:数组[字符串]){
val beep=java.awt.Toolkit.getDefaultToolkit.beep

对于(i
beep
是一种令人讨厌的副作用方法。如果你想重复它,你必须通过类似scalaz
任务的方式捕获它:

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
是一种令人讨厌的副作用方法。如果你想重复它,你必须通过类似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
(即
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
    }   

  }
}
对象声音播放{
导入scala.collection.mutable.ListBuffer
导入java.awt.Toolkit_
val bb=ListBuffer[()=>Unit]()//函数的缓冲区
def main(参数:数组[字符串]){
val beep=getDefaultToolkit.beep//这是一个没有参数的函数
为了
println(b())
Thread.sleep(500)//此暂停是为了听到单独的蜂鸣声
}   
}
}

您正在向
缓冲区添加调用
beep
的结果(即
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
    }   

  }
}
对象声音播放{
导入scala.collection.mutable.ListBuffer
导入java.awt.Toolkit_
val bb=ListBuffer[()=>Unit]()//函数的缓冲区
def main(参数:数组[字符串]){
val beep=getDefaultToolkit.beep//这是一个没有参数的函数
为了
println(b())
Thread.sleep(500)//此暂停是为了听到单独的蜂鸣声
}   
}
}

没关系,我只是想重复一下
嘟嘟声
s。我发现了一种功能选项,它在我的更新中。@pagoda_5b,真的谢谢。没关系,我只是想重复一下
嘟嘟声
s。我发现了一种功能选项,它在我的更新中。@pagoda_5b,真的谢谢。非常感谢@Imm,尽管我不是你唱库
scalaz
,我以前没有用过。我只是做了一个小的更新。非常感谢@Imm,尽管我没有使用库
scalaz
,我以前也没有用过。我只是做了一个小的更新。重要的区别是你已经将
嘟嘟声
移动到
for
循环中。你可以这样做在您最初的示例中,您可以解决眼前的问题(只需调用一次
beep
方法)。我的答案和另一个答案都是处理此类方法的一般方法。重要的区别在于,您已将
beep
移动到
for
循环中。您可以在原始示例中执行此操作,并解决眼前的问题(只需调用
beep
方法一次).我的答案和另一个答案都是处理此类方法的一般方法。