4

との間に何か関係はthis aliasingありself typeますか?this aliasingの特殊なケースですかself type?Scala 2nd P776でのプログラミングで、作者は次のように述べています。

抽象クラスParser[+T] extends ... {p =>

セクション29.4でこのような構文を見ましたが、ここでは、特性に自己型を与えるために使用されていました。

ただし、自己型の構文は次のようにはなりません。次のようになります。

this:SomeAssumedType =>

そして別の質問は、なぜthis aliasing有用なのかということです。参照にエイリアスを与える意味がないのはわかりませんthis。これは、現在のオブジェクト参照の従来のエイリアスであるためです。ただし、Play Frameworkのソースコードでは、次のようなコード(特にアノーム部分)がたくさん見られました。

特性RowParser[+A] extends(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 に答える