【发布时间】:2010-10-25 17:47:01
【问题描述】:
在各种 Scala 文献中,我看到一些使用“this”的自我类型注释和其他使用“self”的注释:
trait A { this: B => ... }
trait A { self: B => ... }
使用“this”或“self”有什么真正的区别吗?你用什么名字有关系吗?这同样有效吗?
trait A { foo: B => ... }
【问题讨论】:
标签: scala
在各种 Scala 文献中,我看到一些使用“this”的自我类型注释和其他使用“self”的注释:
trait A { this: B => ... }
trait A { self: B => ... }
使用“this”或“self”有什么真正的区别吗?你用什么名字有关系吗?这同样有效吗?
trait A { foo: B => ... }
【问题讨论】:
标签: scala
这三种形式都是有效的,并且具有将B 假定为A 类中this 的类型的效果。
前两个变种
trait A { self: B => ... }
trait A { foo: B => ... }
在特征A 中引入self(分别为foo)作为this 的别名。这对于从内部类访问 this 引用很有用。 IE。然后,当从嵌套在其中的类访问特征 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 引入别名;它只是设置自我类型。
【讨论】:
trait A { self: B, C => ... } ?
with 关键字。例如trait A { self: B with C => ... }
_: B =>
区别在于this总是引用最内层模板定义的对象。
表达式
this可以出现在模板或复合类型的语句部分。它代表由包含引用的最内层模板或复合类型定义的对象。如果这是一个复合类型,this的类型就是那个复合类型。如果是简单名称C的类或对象定义的模板,则this的类型与C的类型相同。this。 (Scala 参考§6.5)
因此,如果您将自己的类型称为foo,您仍然可以将其称为this(当然,除非您在内部模板中,在这种情况下this 将引用定义的对象通过它 - 除非你不给内部模板的自我类型相同的名称)但显然不是相反。
【讨论】: