2011-11-03 28 views
3

我已經看到了關於Scala和變量範圍(如Scala variable scoping question)一些問題斯卡拉模糊的變量名中的一個方法

但是,我無法讓我的具體使用情況來工作。

比方說,我有一個名爲回購特點:

trait Repo { 
    val source: String 
} 

然後我要創建回購的實現方法...

def createRepo(source: String) = 
    new Repo { 
    val source: String = source 
    } 

當然,我有兩個source變量在方法級別使用一個,在Repo實現中使用一個。如何從我的Repo定義中引用方法級source

謝謝!

+0

既然都指向同一對象,沒關係。 –

+1

@ user-unknown,這很重要,因爲在第二種情況下,'source'被遞歸綁定,但是類初始化語義使其成爲'null'。從REPL嘗試它,你會看到:'createRepo(「hi」)。source == null'。 –

回答

2

不知道這是否是規範的方式,但它的工作原理:

def createRepo(source: String) = { 
    val sourceArg = source 
    new Repo { 
    val source = sourceArg 
    } 
} 

或者,你可以給你的paramenter不衝突不同的名稱。

或者,做一個工廠:

object Repo { 
    def apply(src: String) = new Repo { val source = src } 
} 

def createRepo(source: String) = Repo(source) 
1

除了路易吉的解決方案,你也可以考慮從性狀改變Repo一類,

class Repo(val source: String) 
def createRepo(source: String) = new Repo(source)