用于特征伴随对象的“apply”方法的大括号

时间:2018-05-21 16:30:03

标签: scala

我正在阅读一些看起来像这样的代码:

trait Thingy {
  def apply(d: => Unit): Unit
   ...
}

object Thingy {
  def apply(d: => Unit) = {
    ...
  }
}

Odersky在他的第3版书中写了关于具有伴侣物品的特征和特征的文章?他的书主要讨论了类如何拥有伴侣对象而不是特征。这是写在哪里的?

另外,您将如何使用thingy?我看到它的使用方式如下:

Thingy {
   implicit variable => 
   val something = ...
}

以上是怎么回事? Odersky似乎没有写过如何使用花括号来调用apply方法。这是怎么回事?这是写在哪里的?

1 个答案:

答案 0 :(得分:3)

在第9章第4节“编写新的控制结构”中,Odersky说(所有错别字都是我的):

  

您可以使客户端代码看起来更像内置控件结构的一种方法是使用花括号而不是括号来包围参数列表。在Scala中您传入一个参数的任何方法调用中,您可以选择使用花括号括起参数而不是括号。

在第3章“第7步”中,他还谈到apply

  

当您将一个或多个值的括号应用于变量时,Scala会将代码转换为对该变量上名为apply的方法的调用。

将这两个规则结合使用会产生

Thingy { ... }

被重写为

Thingy( ... )

然后进入

Thingy.apply(...)

使用隐式参数变得更有趣。例如,对于类型类,通常定义apply,如下所示:

trait MyTypeClass[A]
object MyTypeClass {
  def apply[A](implicit inst: MyTypeClass[A]) = inst
}

这样,值表达式MyTypeClass[Int]会进入MyTypeClass.apply[Int](someImplicitlyInjectedInstance),因此是MyTypeClass[Int]类型的值。因此,值MyTypeClass[Int]和类型MyTypeClass[Int]看起来完全相同。

事实上,没有明确告知特征也可以有伴侣对象:有很多事情没有明确告知。例如,没有明确告诉你可以在Scala中写下type-lambdas,但事实证明你实际上可以。