我对以下代码有疑问:
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 =>
提前感谢您的回复。
答案 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 类型,但没有为其引入别名。