特性定义名称后的大括号在scala中是什么意思?

时间:2019-06-27 09:53:16

标签: scala

使用Future时,我已经看到人们使用

Future{
      Thread sleep 500
      promise success "You've just completed the promise with me in it!"
 }

看看Future的定义,我可以看到Future是一个特征

但是当我做出自己的特征时,示例:

trait t{}
def main(args: Array[String]): Unit = {
    t{
        println("Test")
    }
}

它不会编译。为什么?

2 个答案:

答案 0 :(得分:4)

在编写Future{ /*your code*/ }时,将调用apply的伴随对象的Future方法。

Future的apply方法的签名如下

def apply[T](body:=>T)

您可以看到,在诸如InteliJ之类的IDE中在apply上进行ctrl+clickcmd+click时,会调用Future方法。

您的特征t没有适用。因此,该段代码无法编译。

trait t{}
object t{
  apply[T](body:=>T){}
}

答案 1 :(得分:2)

您描述的Future语法来自特质伴侣对象。

该对象具有以下方法:

  def apply[T](body: =>T)(implicit @deprecatedName('execctx) executor: ExecutionContext): Future[T] =
    unit.map(_ => body)

可接受的参数是返回T的函数,通过您看到的形式(即带括号的代码块)传递它是完全习惯的。

话虽如此,您可以实例化特性(通过创建它们的匿名子类),并通过以下编译:

trait t {}

object MyApp extends App {
  new t {
    println("Test")
  }
}

虽然我不建议将其作为一般的良好做法,但是它有其用途。