猿问

=>、()=>和Unit=>之间有什么区别?

=>、()=>和Unit=>之间有什么区别?

我试图表示一个不带参数且不返回值的函数(如果您必须知道的话,我将在JavaScript中模拟setTimeout函数)。

case class Scheduled(time : Int, callback :  => Unit)

不编译,说“‘val’参数可能不是按名调用”。

case class Scheduled(time : Int, callback :  () => Unit)

编译,但必须奇怪地调用,而不是

Scheduled(40, { println("x") } )

我必须这么做

Scheduled(40, { () => println("x") } )

同样有效的是

class Scheduled(time : Int, callback :  Unit => Unit)

但却以一种更不明智的方式被调用。

 Scheduled(40, { x : Unit => println("x") } )

(单元类型的变量是什么?)我想要当然,它是一个构造函数,如果它是一个普通函数,可以我调用它的方式调用它:

 Scheduled(40, println("x") )

把他的瓶子给孩子!


蓝山帝景
浏览 757回答 3
3回答

狐的传说

case class Scheduled(time : Int, callback :  => Unit)这个case修饰语使隐含val从每个参数中取出构造函数。因此(正如有人指出的)如果你移除case您可以使用按名称调用的参数。编译器可能无论如何都允许它,但是如果它创建了val callback而不是变成lazy val callback.当你改变到callback: () => Unit现在,您的情况只是接受一个函数,而不是一个按名称调用的参数。显然,该函数可以存储在val callback所以没问题。得到你想要的东西的最简单的方法(Scheduled(40, println("x") )其中,使用按名称调用参数传递lambda)可能是跳过case并显式创建apply你一开始是无法得到的:class Scheduled(val time: Int, val callback: () => Unit) {     def doit = callback()}object Scheduled {     def apply(time: Int, callback: => Unit) =         new Scheduled(time, { () => callback })}在使用中:scala> Scheduled(1234, println("x"))res0: Scheduled = Scheduled@5eb10190 scala> Scheduled(1234, println("x")).doit x

qq_花开花谢_0

在这个问题中,您希望用JavaScript模拟SetTimeOut函数。根据以前的答案,我编写了以下代码:class Scheduled(time: Int, cb: => Unit) {   private def runCb = cb}object Scheduled {   def apply(time: Int, cb: => Unit) = {     val instance = new Scheduled(time, cb)     Thread.sleep(time*1000)     instance.runCb  }}在REPL中,我们可以得到如下内容:scala> Scheduled(10, println("a")); Scheduled(1, println("b"))a b我们的模拟行为与SetTimeOut不同,因为我们的模拟是阻塞功能,但SetTimeOut是非阻塞的。
随时随地看视频慕课网APP
我要回答