簡體   English   中英

Scala案例類映射擴展

[英]Scala Case Class Map Expansion

在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

一個相關的線程 ,顯示問題的可能解決方案。

現在,從我已經能夠挖掘的內容來看,至少從Scala 2.9.1開始,關於案例類的反思基本上是無操作的。 然后,凈效應似乎是強制進入某種形式的手動對象創建,考慮到Scala的強大功能,這有點具有諷刺意味。

我應該提一下,用例涉及servlet請求參數映射。 具體來說,使用Lift,Play,Spray,Scalatra等,我想采用已清理的params映射(通過路由層過濾)並將其綁定到目標案例類實例,而無需手動創建對象,也不指定其類型。 這將需要“可靠”的反射,並且需要像“str2Date”那樣來處理類型轉換錯誤。

或許在2.10中使用新的反射庫,實現以上將是蛋糕。 進入斯卡拉只有2個月,所以只是刮擦表面; 我沒有看到任何直接的方法來解決這個問題(對於經驗豐富的Scala開發人員,可能是可行的)

好消息是,Scala的產品界面由所有案例類實現,實際上並沒有讓這很難做到。 我是一個名為Salat的Scala序列化庫的作者,它提供了一些使用pickle Scala簽名來獲取類型字段信息的實用程序

https://github.com/novus/salat - 查看salat-util包中的一些實用程序。

實際上,我認為這是Salat應該做的事情 - 這是一個好主意。

Re:DC Sobral關於在編譯時無法驗證params的觀點 - 在實踐中這應該在運行時工作,就像反序列化其他任何不保證結構的東西一樣,如JSON或Mongo DBObject。 此外,Salat還有一些工具可以利用提供的默認args。

這是不可能的,因為在編譯時無法驗證是否在該映射中傳遞了所有參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM