2011-05-23 87 views
2

我有一個階語法問題 - 說我有一個簡單的依賴圖案構造類似於下面Scala的變量範圍問題

trait Master { 
    val foobar 

    object SubObject extends SubObject { 
     foobar = foobar 
    } 
} 

trait SubObject { 
    val foobar 
} 

顯然,這不會編譯,由於參考 foobar的= foobar的 是不明確的。

如何指定表達式的RHS應引用Master的foobar變量?對於我應該知道的'這個'或'自我'有某種特殊用法嗎?

回答

5

我認爲最簡單的方法是使用自定義類型。除了一些很酷的類型理論效果之外,還可以使用self-type來創建「this」的別名。 (沒有測試)

trait Master { 
    master => 
    val foobar 

    object SubObject extends SubObject { 
     foobar = master.foobar 
    } 
} 

trait SubObject { 
    val foobar 
} 
+0

嗯,也許不是最簡單的方法,你可能應該給複選標記,以安傑的解決方案,但你應該知道的自我類型別名招爲好。 – 2011-05-23 16:19:10

+0

我最初開始使用自己的類型和一個簡單的蛋糕模式,我最終可能會回到最後,但我想要一個簡單的Environment對象,它爲我創建了一切,並不一定要混合到所有需要它的東西中。 – dpratt 2011-05-23 16:29:35

+0

另外,我不一定希望將「object」用於這種依賴注入形式(或者對於伴隨對象除外)。稍微不詳細地說一些類似「lazy val subObject = new SubObject {foobar = master.foobar}」 – 2011-05-23 16:41:44

6

可以使用Master.this預選賽專門引用外部範圍,類似如下:

trait Master { 
    val foobar = "Hello world" 

    object SubObject extends SubObject { 
     val foobar = Master.this.foobar 
    } 
} 

trait SubObject { 
    val foobar:String 
}