2015-02-04 6 views
0

Я использовал этот 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 _) 

Это создает Считывает что:

  1. Первый - когда дано JsValue (через его «читает» метод) - он тянет «лат», а затем «длинный». Из этих двух он создает кортеж (Double, Double). - https://www.playframework.com/documentation/2.3.x/api/scala/index.html#play.api.libs.json.Reads

  2. Этот кортеж затем присваивается частичной функции этого чтения ..., в этом случае это то, что возвращается «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 ... *), когда данный экземпляр местоположение, он будет:

  1. передать этот объект через эта частичная функция, созданная unlift (Location.unapply).

  2. Кортеж (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


ОБНОВЛЕНИЕ:

+0

Это, по сути, дубликат вопроса, который вы связали в своем обновлении. 'и' является просто псевдонимом для '~'. Если вы все еще не уверены в вещах, можете пересмотреть свой вопрос до тех частей, которые вы не понимаете из связанного ответа? –

+0

Спасибо. Да, я нашел ссылку после того, как отправил свой вопрос. Принял несколько пробных запросов с поисковыми запросами, чтобы понять это, поэтому я поставил его здесь для удобного поиска в будущем. Закройте этот вопрос. –

ответ

0

Если вы сомневаетесь, декомпилировать. Это показало, что существует неявный toFunctionalBuilderOps, который затем you can see in FunctionalBuilderOps, что есть ваш метод and

+0

В случае с downvoter, почему? –

+0

Спасибо. Я нашел объяснение в связанном URL. –