为了账号安全,请及时绑定邮箱和手机立即绑定

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

=>、()=>和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") )把他的瓶子给孩子!
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超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


查看完整回答
反对 回复 2019-07-15
?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

在这个问题中,您希望用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是非阻塞的。


查看完整回答
反对 回复 2019-07-15
  • 3 回答
  • 0 关注
  • 756 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信