#scala
Вопрос:
Я следую этому учебнику по GraphQL с помощью Sangria. Меня интересует следующая строка
val JsObject(fields) = requestJSON
где requestJSON
находится объект JsValue
. Этот способ назначения fields
является новым для меня, и мой вопрос в том, можете ли вы назвать этот шаблон или предоставить мне ссылку на учебник, касающийся этой структуры.
Ответ №1:
Это шаблон экстрактора, вы можете достичь того же результата, реализовав метод unapply для вашего произвольного объекта (как показано в примере). Когда вы создаете case class
компилятор, он создает для вас неприменимый метод, поэтому вы можете сделать:
case class Person(name : String, surname : String)
val person = Person("gianluca", "aguzzi")
val Person(name, surname) = person
Ответ №2:
Важно знать, что val
определения поддерживают шаблон в левой части задания, обеспечивая тем самым (подмножество функций) Сопоставление шаблонов.
Итак, ваш пример эквивалентен:
val fields = requestJSON match {
case JsObject(foo) => foo
}
Подробные сведения см. в разделе Спецификации языка Scala 4.1 Объявления и определения значений.
Так, например, если у вас есть список l
и вы хотите назначить первый элемент и остальные, вы можете написать:
val x :: xs = l
Или, для довольно распространенного случая, когда метод возвращает кортеж, вы можете написать:
val (result1, result2) = foo()