在各种文献斯卡拉我看到用“这个”一些自我型注释和其他使用“自我”:自我注释中的自我与自我之间的区别?
trait A { this: B => ... }
trait A { self: B => ... }
有没有使用“这个”或“自我”之间的真正区别?你用什么名字重要吗?这是否有效?
trait A { foo: B => ... }
在各种文献斯卡拉我看到用“这个”一些自我型注释和其他使用“自我”:自我注释中的自我与自我之间的区别?
trait A { this: B => ... }
trait A { self: B => ... }
有没有使用“这个”或“自我”之间的真正区别?你用什么名字重要吗?这是否有效?
trait A { foo: B => ... }
所有三种形式都是有效的,其效果是B
被假定为类别A
中的类型。
前两个变体
trait A { self: B => ... }
trait A { foo: B => ... }
介绍self
(分别为foo
)如性状A
用于this
的别名。这对于从内部类访问this
引用很有用。即当从嵌套在其中的类访问特征A
时,您可以使用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
不会引入一个别名;它只是设置自我类型。
有一个区别在于this
总是指由最内层模板定义的对象。
表达式
this
可以出现在模板或复合类型的语句部分。它表示由最内层的模板或复合类型定义的对象包含引用。如果这是一个复合类型,则this
的类型就是该复合类型。如果它是简单名称C的类或对象定义的模板,则其类型与C的类型相同。this
。 (斯卡拉参考。§6.5)
所以,如果你打电话给你的自我型foo
,你仍然可以把它称为this
(当然,除非,你是在内部模板在这种情况下this
将参考到它定义的对象 - 除非你不给内部模板的自我类型相同的名称),但显然不是相反的方式。
我看自我类型的方式是,特质宣称自己采取某种类型并返回代码块,例如foo:B => {...}。现在这些卷毛当然被省略了。有趣的是,在代码中的任何范围内,你都可以使用对象名称而不是“this”来代替“this”,但是[javascript] – 2013-07-13 15:20:57
@Martin Odersky是否可以为两个或更多特性添加限制,像'特质A {自我:B,C => ...}'? – 2014-11-05 08:57:37
@DmitryBespalov:是的,您可以在自我打字的注释中使用'with'关键字。例如'特质A {自我:B,C => ...} – Dave 2014-12-19 10:11:08