2010-10-25 40 views
117

在各种文献斯卡拉我看到用“这个”一些自我型注释和其他使用“自我”:自我注释中的自我与自我之间的区别?

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

有没有使用“这个”或“自我”之间的真正区别?你用什么名字重要吗?这是否有效?

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

回答

156

所有三种形式都是有效的,其效果是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不会引入一个别名;它只是设置自我类型。

+0

我看自我类型的方式是,特质宣称自己采取某种类型并返回代码块,例如foo:B => {...}。现在这些卷毛当然被省略了。有趣的是,在代码中的任何范围内,你都可以使用对象名称而不是“this”来代替“this”,但是[javascript] – 2013-07-13 15:20:57

+4

@Martin Odersky是否可以为两个或更多特性添加限制,像'特质A {自我:B,C => ...}'? – 2014-11-05 08:57:37

+13

@DmitryBespalov:是的,您可以在自我打字的注释中使用'with'关键字。例如'特质A {自我:B,C => ...} – Dave 2014-12-19 10:11:08

16

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

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

所以,如果你打电话给你的自我型foo,你仍然可以把它称为this(当然,除非,你是在内部模板在这种情况下this将参考到它定义的对象 - 除非你不给内部模板的自我类型相同的名称),但显然不是相反的方式。