4

this aliasing和之间有什么关系self type吗?是this aliasing特例self type吗?在scala 2nd P776编程中,作者说:

抽象类 Parser[+T] 扩展 ... { p =>

你在第 29.4 节看到了这样的语法,它被用来给一个 trait 赋予一个 self 类型。

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

这:SomeAssumedType =>

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

特征 RowParser[+A] 扩展 (Row => SqlResult[A]) {

父母 =>

为什么这有意义?

4

1 回答 1

4

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

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

如果你不包含类型归属,Scala 将假定变量的类型是周围类的类型,从而给你一个简单的this.

如果您保留名称this和归属,那么 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
于 2012-05-31T15:52:13.513 回答