这里似乎有两个混淆。第一个是由 Rex 和 Kim 确定的。您可以阅读Scala 中的编程 中的this section 以了解更多信息。归结为:
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 => }
第二个困惑是你想“从方法参数中创建一个ChangeSet对象”。如果我理解正确,您正在尝试使用案例类语法构造一个对象:
ChangeSet(field, from, to)
这在模式匹配的那一侧不起作用。模式匹配的 case 端发生的事情实际上可以看作是 ChangeSet 构造的 reverse。 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
}
}