Scala这个别名和自我类型

时间:2012-05-31 15:44:54

标签: scala playframework

this aliasingself type之间是否有任何关系? this aliasingself type的特例吗? 在scala 2nd P776的编程中,作者说:

  

抽象类解析器[+ T]扩展... {p =>

     

你在第29.4节中看到了这样的语法,它用于给出一个   自我型到特质。

但是,self类型的语法看起来不像这样,它就像:

  

this:SomeAssumedType =>

另一个问题是为什么this aliasing有用?我看不出给this引用别名有什么意义,因为它已经是当前对象引用的传统别名,但是在Play框架源代码中,我看到了很多代码(特别是,anorm部分) )喜欢:

  

trait RowParser [+ A] extends(Row => SqlResult [A]){

     

parent =>

为什么这有意义?

1 个答案:

答案 0 :(得分:4)

您可以同时拥有自我类型和this别名:

abstract class Parser[+T] { p: SomeAssumedType => … }

如果您不包含类型归属,Scala将假定变量的类型是周围类的类型,从而为this提供了一个简单的别名。

如果您将名称this保留为ascription,则Scala希望您以能够实现归属的方式初始化此类。

至于this别名。以下是需要这种情况:

object OuterObject { outer =>
  val member = "outer"
  object InnerObject {
    val member = "inner"
    val ref1 = member
    val ref2 = this.member
    val ref3 = outer.member

    def method1 = {
      val member = "method"
      member
    }
    def method2 = {
      val member = "method"
      this.member
    }
    def method3 = {
      val member = "method"
      outer.member
    }
  }
}

scala> OuterObject.InnerObject.ref1
res1: java.lang.String = inner

scala> OuterObject.InnerObject.ref2
res2: java.lang.String = inner

scala> OuterObject.InnerObject.ref3
res3: java.lang.String = outer

scala> OuterObject.InnerObject.method1
res4: java.lang.String = method

scala> OuterObject.InnerObject.method2
res5: java.lang.String = inner

scala> OuterObject.InnerObject.method3
res6: java.lang.String = outer