Присвоение значения arg с помощью объекта val(arg) = объект

#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()