看來這裏有兩個混淆。第一個是由Rex和Kim確定的。你可以從讀取this section編程Scala瞭解更多信息。它歸結爲:
x match { case Some(foo) => } // variable pattern, defines and binds variable foo
x match { case Some(Foo) => } // constant pattern, based on val Foo
x match { case Some(`foo`) => } // constant pattern for lowercase val
你也可以使用一個後衛來約束比賽
x match { case Some(foo) if condition => }
第二個困惑是要「從做一個變更對象通過方法參數「。如果我正確地理解了你,你正試圖使用case類語法構造一個對象:
ChangeSet(field, from, to)
這不適用於模式匹配的那一邊。發生在案例一側的模式匹配事實上可以看作是構建ChangeSet的反向。 match { case ChangeSet(field, from, to) => }
解構ChangeSet
對象並將其零件分配到field
,from
和to
值。當它是這樣組成的時候也是如此:Some(ChangeSet(field, from, to))
,它首先解構Some
然後ChangeSet
。你可以看到,在值工作定義,因爲它是利用相同的解構機制:
scala> val cset = ChangeSet("a", "from", "to")
cset: ChangeSet = ChangeSet(a,from,to)
scala> val Some(ChangeSet(s, o1, o2)) = Some(cset)
s: String = a
o1: java.lang.Object = from
o2: java.lang.Object = to
看來你想要做的是建立一個新的對象,副本ChangeSet
價值,但用單場。案例類支持這一帶copy
,我REPL例如繼續:
scala> val cset2 = cset.copy(from = o2)
cset2: ChangeSet = ChangeSet(a,to,to)
考慮到這一點,這裏是change
另一個建議:
def change(field:String, from:Object, to:Object) {
changed.find(_.field == field) match {
case Some(cset) =>
val csetnew = cset.copy(from = to)
// do stuff with csetnew
case None =>
// do stuff
}
}
反引號符號最棘手的部分是如何讓它在StackOverflow答案中正確顯示:-) – 2011-05-30 07:31:00