2012-05-31 46 views
4

this aliasingself type之間有任何關係? 是this aliasing的特例self type? 在第二階編程P776,對筆者說:斯卡拉這個別名和自我類型

抽象類解析器[+ T] ...擴展{P =>

你看到的語法像這樣在29.4節,在那裏它被用來給自我類型 特性。

但是,自我型的語法看起來不像這樣,它就像:

這樣的:SomeAssumedType =>

而另一個問題是,爲什麼this aliasing是有用的?我看不出有什麼意義可以給this引用一個別名,因爲它已經是當前對象引用的傳統別名,但是在Play框架源代碼中,我看到了很多代碼(特別是anorm部分),如:

性狀RowParser [+ A]延伸(行=> SQLRESULT [A]){

父=>

爲什麼這有意義嗎?

+0

類似:http://stackoverflow.com/questions/8073263/explicit-self-references-with-no-type-difference-with-this – Philippe

+0

@Philippe什麼我真的很想知道爲什麼有必要別名這個參考。我知道'p =>'是'this'的一個參考,但是我沒有看到有任何意義,所以我不能在我的代碼中使用它,並且可能會錯過閱讀其他代碼的內容。 – Sawyer

+0

對。正如對這兩個問題的答案中所解釋的那樣,當您需要一個引用來從內部類中封裝類時,這很有用。 – Philippe

回答

4

您可以在同一時間自我型和this別名:

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

如果不包括類型歸屬,斯卡拉將假設變量的類型的類型周圍的類,因此給你一個簡單的別名爲this

如果您保留名稱this與歸屬,然後斯卡拉期望您初始化這個類的方式,可以實現歸屬。對於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