Я использовал этот json combinator для нескольких базовых/стандартных корпусов, не понимая, как это работает. Все было хорошо.Что это за «и» в ScalaJsonCombinator (при определении Writes)?
Теперь я хочу, чтобы я подготовился к тому, что может произойти в случае каких бы то ни было сложных случаев; Мне нужно понять код.
Ref .: https://www.playframework.com/documentation/2.3.x/ScalaJsonCombinators
Я думаю, что я могу понять Читает:
implicit val locationReads: Reads[Location] = (
(JsPath \ "lat").read[Double] and
(JsPath \ "long").read[Double]
)(Location.apply _)
Это создает Считывает что:
Первый - когда дано JsValue (через его «читает» метод) - он тянет «лат», а затем «длинный». Из этих двух он создает кортеж (Double, Double). - https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads
Этот кортеж затем присваивается частичной функции этого чтения ..., в этом случае это то, что возвращается «Location.apply _». Я попробовал его в РЕПЛ:
...
scala> val yowMan = Location.apply _
yowMan: (Double, Double) => Location = <function2>
scala> yowMan(1, 2)
res14: Location = Location(1.0,2.0)
Это частичная функция принимает кортеж из (Double, Double) в качестве входных данных. Итак ... результат шага 1 направляется на шаг 2, и мы получаем экземпляр Location как возврат «reads».
Теперь для Пишет:
implicit val locationWrites: Writes[Location] = (
(JsPath \ "lat").write[Double] and
(JsPath \ "long").write[Double]
)(unlift(Location.unapply))
Сначала "Исключить". Я пытался в РЕПЛ:
scala> val heyDude = Location.unapply
<console>:16: error: missing arguments for method unapply in object Location;
follow this method with `_' if you want to treat it as a partially applied function
val heyDude = Location.unapply
К сожалению, хорошо, я следовал инструкции:
scala> val heyDude = Location.unapply _
heyDude: Location => Option[(Double, Double)] = <function1>
Ok, таким образом мы получаем частичную функцию, которая преобразует экземпляр Местоположение к (не обязательно) кортежем (Двухместный, Двухместный).
Далее "unlift":
scala> val hohoho = unlift(heyDude)
hohoho: Location => (Double, Double) = <function1>
scala> val loc = Location(1, 2)
loc: Location = Location(1.0,2.0)
scala> hohoho(loc)
res16: (Double, Double) = (1.0,2.0)
Ok, так что ... unlift просто выбрасывает "Option", и возвращает нас непосредственно к кортежу.
Ok ... так что ... Я думаю ... это "пишет" из Writes ... *), когда данный экземпляр местоположение, он будет:
передать этот объект через эта частичная функция, созданная unlift (Location.unapply).
Кортеж (Double, Double), возвращаемый этой частичной функции затем направляется к тому, что производится следующим образом:.
(JsPath \ "ш") пишут [Double] и (JsPath \ «длинный «).написать [Двойной]
Что именно такое «что угодно»? После API-документа JsPath, я думаю, что это OWrites: https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.OWrites
Но ... Я не вижу, что в OWrites есть метод с именем «и». Где это "и" объявлено? И что он делает? Это: «oWrites1 и oWrites2» производит «oWrites3»? И этот «oWrites3» - это особый тип OWrites, который берет кортеж в качестве входных данных? ... Если это так ... кортеж не имеет информации о названии свойства в классе case («lat» и «long»). Как он знает, что созданная строка json должна быть {"lat": 1, "long": 2} then?
Извините за поезд вопросов. Пожалуйста, помогите мне получить четкое представление об этом. Благодаря!
*) https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Writes
ОБНОВЛЕНИЕ:
- Добавление связанный с этим вопрос: Syntax and meaning of a Scala/Play! code sample
Это, по сути, дубликат вопроса, который вы связали в своем обновлении. 'и' является просто псевдонимом для '~'. Если вы все еще не уверены в вещах, можете пересмотреть свой вопрос до тех частей, которые вы не понимаете из связанного ответа? –
Спасибо. Да, я нашел ссылку после того, как отправил свой вопрос. Принял несколько пробных запросов с поисковыми запросами, чтобы понять это, поэтому я поставил его здесь для удобного поиска в будущем. Закройте этот вопрос. –