2014-01-05 36 views
-1

假設我有以下類:如何在Scala中優雅地編寫這個函數?

case class Field(name: String, default: String) 
case class Type(name: String, fields: Set[Field]) 
case class Info(name: String, type: Type, values: Map[Field, String]) 

顯然,對於任何info:Info

info.values.keySet == info.type.fields 

假如我也有一個info:InfonewType:Type使

info.type.name == newType.name 

現在我需要創建newInfo:Info給出info: InfonewType: Type,這樣:

1. newInfo.type == newType 
2. newInfo.values.keySet = newType.fields 
3. for each newField in newType.fields if !info.type.fields.contains(newField) 
     newInfo.values(newField) == newField.default  

我不知道如何編寫一個函數來簡單和優雅創造newInfo

def makeNewInfo(info: Info, newType: Type): Info = { 
    assert info.type.name == newType.name 
    ... // ??? 
} 
+0

我猜你想要的所有數據從'info'複製到'newInfo' ?所有的字段是否都會出現在'newInfo'中? –

+0

只有在'newType'中出現的字段。如果'info'包含字段'f',其中'_does不存在於'newType中,'newInfo'不應該包含'f'。 – Michael

+0

請注意,如果'info'不包含字段'f1',其中_does_出現在'newType'中,那麼'newInfo'應該包含'f1'及其默認值。 – Michael

回答

2
val droppedFields = info.type.fields -- newType.fields 
val addedFields = newType.fields -- info.type.fields 
info.copy(values = info.values -- droppedFields ++ addedFields.map(f => (f, f.default))(collection.breakOut)) 
相關問題