2011-02-28 72 views
3

我注意到scala.xml.Atom的類型參數爲A,儘管它的所有子類都擴展爲Atom[String],並且文檔中提到「類Atom爲文本提供了一個XML節點(PCDATA)」。爲什麼scala.xml.Atom類型參數化?

是否有合法的用例來實例化類型參數不是字符串的Atom?

更具體地說,我對使用Scala XML文字來定義一種很好的DSL來定義基於內存樹的文檔結構感興趣,其中許多節點將是現有的Scala類。使用<document>{new JButton("Hi")}</document>並訪問Atom[JButton]中的非文本數據將會非常好,無需爲每個現有類定義XML序列化方案。

這是一個合法的用例,還是我濫用Scala的XML庫的當前實現?

回答

3

如果你看一看sources的原因是揭露。 Atom是通用的,因爲它將傳遞的對象轉換爲String。所以你可以通過一個JButton它,但它只會調用它的toString方法。 (第48行是最重要的)

我想這是可能得到的數據傳回了原子的:

val doc = <document>{ 42 }</document> 

doc.child.head match { 
    case i: Atom[Int] => i.data/7 
    case _ => error("Unsupported type") 
} 

回報6。所以你的計劃會奏效。我仍然認爲基於抽象類和案例類的樹會是更好的選擇,因爲使用您的方法,所有類型的安全性都會消失,因爲您可以傳遞所有類型,以便在運行時才能發現類型錯誤。

+0

謝謝!聽起來就像他們只是將它作爲一個通用的縮寫,以便在toString時省略toString調用更方便。雖然它沒有解釋爲什麼他們持有對初始對象的引用,而不是緩存到toString,但無論如何,這可能不是我應該依賴的行爲。 – Mike 2011-03-01 19:03:06

3

如果你看看http://sites.google.com/site/burakemir/scalaxbook.docbk.html?attredirects=0,你會發現Atom確實是「用於包含任何類型數據的節點,例如int,Date」。

如你觀察到的,內部元件嵌入表達式變成原子如果它們不是字符串,例如

<foo>{42}</foo> 

具有作爲子的Atom [INT]。

要添加到原子的屬性值,你必須寫

<foo life={new Atom(42)}> 

(在「書」,這只是凌動(42),但是,當時 - 凌不再是案例類繼承已被棄用)

所以,是的,你想要做的是完全在設計精神之內。

但是這種設計已經有幾年的歷史,很多人對某些決定感到不滿。 Scala中的XML支持將來可能會被清除,而這個相當模糊的功能可能無法存活。

相關問題