自我类型注释中这与自我的区别?

时间:2010-10-25 17:47:01

标签: scala

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

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

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

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

2 个答案:

答案 0 :(得分:173)

这三种表单都有效,并且B被假定为类thisA的类型。

前两个变种

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

self(分别为foo)作为特征thisA的别名。这对于从内部类访问this引用很有用。即然后,当您从嵌套在其中的类中访问特征self的{​​{1}}引用时,可以使用A.this而不是this。例如:

A

第三种变体,

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 => ... } 引入别名;它只是设置自我类型。

答案 1 :(得分:17)

不同之处在于this始终引用最里面模板定义的对象。

  

表达式this可以出现在模板或复合类型的语句部分中。它代表由包含引用的最里面的模板或复合类型定义的对象。如果这是复合类型,this的类型就是复合类型。如果它是具有简单名称​​ C 的类或对象定义的模板,则其类型与 C this的类型相同。 (斯卡拉参考文献§6.5)

因此,如果您调用自我类型foo,您仍然可以将其称为this(当然,除非您在内部模板中this将引用它定义的对象 - 除非你没有给内部模板的自我类型赋予相同的名称),但显然不是相反的。