2012-06-21 37 views
3

我正在嘗試將更新方法添加到Symbol類。無法將更新方法添加到符號

class SymbolUpdate(s: Symbol) { 
    def update(i: Int) = s.name + i 
} 
implicit def toSymbolUpdate(s: Symbol) = new SymbolUpdate(s) 

但是當我運行的代碼,我得到以下

scala> 's = 1 
<console>:327: error: value update is not a member of object Symbol 
       's = 1 
      ^

但它確實工作時,我直接調用該方法。

scala> 's.update(1) 
res41: java.lang.String = s1 

或者如果我明確地把一個空的參數數組。

scala> 's() = 1 
res42: java.lang.String = s1 

不知道我的代碼有什麼問題?

+0

我的印象是單個參數apply方法仍然需要顯式的空參數列表。我花了一些時間在互聯網上查找反例,但無濟於事。你確定你要求的是有效的嗎? (這不是隱含的失敗,因爲2.9.1中的SymbolUpdate的顯式實例化在沒有空的arg列表的情況下也不能更新)。 –

+0

我真的很好奇你在這裏試圖完成什麼。通常'update'用於修改一個可變容器,比如'Array'。這裏'update'不會修改任何內容,只返回一個'String'。 – leedm777

+0

我正在創建一個DSL,其中有「變量」被分配了值並創建了一個這樣的活動模型。在這種情況下,符號被設計爲表示我的DSL中的變量。這個例子並不代表我的用途。只需要它做一些事情來說明我的問題。 –

回答

5

按照Scala Language Spec

賦值f(args) = e與函數應用到「=」運算符左側被解釋爲f.update(args, e),即一個update功能 德音響通過f定義的調用。

如果你讀Programming in Scala相應部分這是特別清楚:

類似地,當分配給一個變量給哪個括號和一個或多個參數已經被應用,則編譯器將轉換將其轉換爲將括號中的參數以及等號右邊的對象作爲參數的更新方法的調用。

在一起,我認爲括號是必需的。

+0

是的,可悲的是,這也是我的理解。我正在嘗試做一個DSL,並且從可用性的角度來看,額外的括號會減損。 Thx –

+0

在你的DSL中,你可以定義一個新的運營商,看起來很像平等。 '隱式def addColonEquals(s:Symbol)= new {def:=(i:Int)= s.name + i}'。 – leedm777

+0

是的,這可能是我採取的路線。感謝您的建議! –

相關問題