似乎我可以使用self
或this
来引用混合实例,或者更确切地说是限制混合实例。例如,那些是等价的吗?
scala> trait A { self: List[_] => }
defined trait A
scala> trait B { this: List[_] => }
defined trait B
这只是一个约定,还是使用与this
不同的东西提供了一些好处?
答案 0 :(得分:18)
在具有引用封闭实例的成员类型的情况下,使用“this”以外的名称会很有用。例如,
trait Outer { self =>
trait Inner {
def outer = self
}
}
优于
trait Outer {
trait Inner {
def outer = Outer.this
}
}
在某些情况下。
答案 1 :(得分:6)
它可以是任何东西:self,this,meep,blah等。它仅由编译器用于确定要转换到哪个类(当调用其上的方法时)并且实际上不显示在字节码中。< / p>
命名时要小心,因为本地标识符会覆盖自我类型定义:
trait A {
def baz = println("baz!")
}
trait B {
foo: A =>
val foo = "hello"
// def bar = foo.baz // does not compile because foo is String, not A
def bar = foo.substring(1)
}