在Groovy一個可以這樣做:斯卡拉案例類地圖擴展
class Foo {
Integer a,b
}
Map map = [a:1,b:2]
def foo = new Foo(map) // map expanded, object created
據我所知,Scala是不是在這個詞的,Groovy的任何意義,但如果在這種情況下地圖擴展支持想知道
簡單地說,我嘗試與失敗:
case class Foo(a:Int, b:Int)
val map = Map("a"-> 1, "b"-> 2)
Foo(map: _*) // no dice, always applied to first property
一個相關thread,顯示的問題可能的解決方案。
現在,從我已經能夠挖掘出來的情況來看,至少從Scala 2.9.1開始,關於案例類的反思基本上是沒有用的。那麼淨效果似乎是人們被迫進入某種形式的手工對象創建,這在賦予Scala的力量的情況下有點諷刺。
我應該提一下,用例涉及servlet請求參數映射。具體來說,使用Lift,Play,Spray,Scalatra等,我想採用清理過的params圖(通過路由層過濾),並將其綁定到目標案例類實例,無需手動創建對象,也不指定其類型。這需要「可靠的」反射,並像「str2Date」那樣處理類型轉換錯誤。
也許在2.10用新的反射庫,執行上面的就會是蛋糕。僅僅2個月就進入斯卡拉,所以只是抓表面;我沒有看到任何直截了當的方式來解決這個問題(對於經驗豐富的Scala開發人員,也許是可行的)
這當然不是直截了當的。然而,我不明白這個問題提出的問題是否與你所關聯的另一個人沒有解決 - 你能否澄清你的問題和那個問題之間的區別? – 2012-01-05 18:29:47
我在問具體的地圖擴展。在Groovy中,映射會自動應用於每個類屬性。我假設用Scala _ *符號表示可以以相同的方式將地圖元素應用於案例類。顯然不是這樣的。我也想提出反思,因爲另一個線索沒有提到這個問題。 AFAIK,沒有反射,就不會有運行時間從一種類型轉換到另一種類型(例如,從SQL結果集到Scala對象到JSON)。我會犧牲性能,只需要節省我重複鍵入已定義的類屬性 - 一旦足夠... – virtualeyes 2012-01-05 19:01:26