在各种 Scala 文献中,我看到一些使用“ this”的自我类型注释,还有一些使用“ self”的自我类型注释:
trait A { this: B => ... } trait A { self: B => ... }
使用“这个”和“自我”有什么真正的区别吗?你用什么名字重要吗?这也一样有效吗?
trait A { foo: B => ... }
不同之处在于,this总是引用由最里面的模板定义的对象。
this
表达式 this可以出现在模板或复合类型的语句部分中。它表示由包含引用的最内层模板或复合类型定义的对象。如果这是一个复合类型,那么 this的类型就是那个复合类型。如果它是一个简单名称为 C的类或对象定义的模板,那么它的类型与 C.this的类型相同。(Scala Ref.6.5)
所以,如果你调用你的自我类型 foo,你仍然可以把它称为 this(当然,除非你在一个内部模板中,在这种情况下,this将引用由它定义的对象-除非你不给内部模板的自我类型相同的名字) ,但显然不是反过来。
foo
所有这三种形式都是有效的,其效果是 B被假定为类 A中的 this类型。
B
A
前两个变种
trait A { self: B => ... } trait A { foo: B => ... }
在性状 A中引入 self(分别为 foo)作为 this的别名。这对于从内部类访问 this引用很有用。也就是说,当从嵌套在其中的类访问 trait A的 this引用时,您可以使用 self而不是 A.this。例如:
self
A.this
class MyFrame extends JFrame { frame => getContentPane().add( new JButton( "Hide" ) { addActionListener( new ActionListener { def actionPerformed( e: ActionEvent ) { // this.setVisible( false ) --> shadowed by JButton! frame.setVisible( false ) } }) }) }
第三种变体,
trait A { this: B => ... }
不引入 this的别名; 它只是设置 self 类型。