什么是自我类型注释背后的Scala构造?

时间:2014-01-19 11:41:30

标签: scala self-type

我对以下代码有疑问:

  trait Connection {
    def query(q: String): String
  }
  trait Logger {
    def log(l: String): Unit
  }

  trait RequiredServices {
    def makeDatabaseConnection: Connection
    def logger: Logger
  }

  trait TestServices extends RequiredServices {
    def makeDatabaseConnection = new Connection { def query(q: String) = "test" }
    def logger = new Logger { def log(l: String) = println(l) }
  }

  trait ProductFinder { this: RequiredServices =>
    def findProduct(productId: String) = {
      val c = makeDatabaseConnection
      c.query(productId)
      logger.log("querying database..")
    }
  }
  object FinderSystem extends ProductFinder with TestServices  

我的问题特别涉及以下部分代码:

this: RequiredServices =>
        def findProduct(productId: String) = {
...

上述Scala构造的名称是什么?即 this: RequiredServices =>

提前感谢您的回复。

1 个答案:

答案 0 :(得分:2)

名称是自我类型注释。 Scala语言规范的§5.1(模板)中对此进行了解释,如下所示:

  

模板语句的序列可以以形式参数定义和箭头为前缀,例如, x =>或 x:T =>。如果给出了形式参数,则可以将其用作模板整个主体中 this 的别名。如果形式参数带有类型 T ,则此定义会影响基础类或对象的自身类型S ,如下所示:让 C 为定义模板的类或特征或对象的类型。如果为正式自我参数指定了类型 T ,则 S T C 的最大下限。如果没有给出 T 类型, S 就是 C 。在模板内部, this 的类型被假定为 S

     

类或对象的self类型必须符合模板 t 继承的所有类的self类型。

     

第二种形式的自我类型注释只读这个: S =>。它为 this 规定了 S 类型,但没有为其引入别名。