Scala中的this别名和自类型

4
这里有没有this aliasingself type之间的关系?this aliasingself type的一个特例吗? 在Programming in Scala第二版P776中,作者说:

abstract class Parser[+T] extends ... { p =>

你在第29.4节中看到了这样的语法,它被用于为trait提供自类型。

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

this:SomeAssumedType =>

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

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

parent =>

这样做有什么意义?

类似: https://dev59.com/Ymsz5IYBdhLWcg3wLUt2 - Philippe
@Philippe,我真正想知道的是为什么需要给this引用取别名。我知道p =>this的一个引用,但我不明白有什么必要性,因此我无法在我的代码中使用它,也可能会错过阅读他人代码时的一些重要信息。 - Sawyer
正确。如两个问题的答案所解释的那样,当您需要从内部类引用封闭类时,这非常有用。 - Philippe
@Philippe,这在《Scala编程》中也有提到,但在Play框架源代码中并没有使用内部类,也许这只是这种用法的不好的例子。 - Sawyer
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接