Кажется, здесь есть две путаницы. Первый - тот, который определили Рекс и Ким. Вы можете прочитать этот раздел из Программирование в 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 => }
Второе заблуждение в том, что вы хотите "создать объект ChangeSet с помощью to из параметров метода" . Если я вас правильно понимаю, вы пытаетесь построить объект, используя синтаксис класса case:
ChangeSet(field, from, to)
Это не работает на той стороне сопоставления с образцом. То, что происходит на стороне case сопоставления с образцом, на самом деле можно рассматривать как reverse конструкции 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
, но заменяет одно поле. Классы Case поддерживают это с 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
}
}