这与自我types注释中的自我之间的区别?

在各种Scala文学中,我看到一些使用“this”的自我注释和其他使用“self”的注释:

trait A { this: B => ... } trait A { self: B => ... } 

使用“this”还是“self”有什么区别? 你用什么名字重要? 这是否有效?

 trait A { foo: B => ... } 

所有三种forms都是有效的,并且具有B被认为是A类中的thistypesA 。 变种

 trait A { self: B => ... } trait A { foo: B => ... } 

在特征A引入self (分别为foo )作为别名。 这对于从内部类访问this引用非常有用。 也就是说,你可以使用self而不是A.this从嵌套在它的类访问特质Athis引用。 第三个变体,

 trait A { this: B => ... } 

不会this引入别名; 它只是设置自我types。

有一个区别在于this总是指最内层模板定义的对象。

expression式可以出现在模板或复合types的语句部分。 它表示由最内层的模板或复合types定义的对象,它包含引用。 如果这是一个复合types,这个types就是这个复合types。 如果它是一个具有简单名称C的类或对象定义的模板,则其types与C的types相同。 this 。 (Scala Ref。§6.5)

所以,如果你调用你的self-type foo ,你仍然可以这样引用它(当然,除非你在一个内部模板中,在这种情况下, this将引用它所定义的对象 – 除非你不给内部模板的自我types相同的名称),但显然不是相反的方式。