Поведение карты () на Опции
Я пытаюсь отобразить экземпляр JSONObject в фактический экземпляр с помощью Play Combinators. Я могу правильно выполнить работу по десериализации. Вопрос в том, как map() работает с опцией [JSONObject].
Опция 1:
jsonVal: Option[JSONObject] = getAsJson(input)
jsonVal.map(JSONUtil.fromJsonString(_.toString(), Blah.jsonReads))
Не работает, не компилируется, так как _ не разрешен правильно. Компилятор не может найти toString() для объекта.
Option2:
jsonVal: Option[JSONObject] = getAsJson(input)
jsonVal.map(_.toString()).map(JSONUtil.fromJsonString(_, Blah.jsonReads))
Работает!!. Может кто-нибудь сказать мне, почему тип переменной по умолчанию не распространяется, когда преобразование выполняется как часть аргумента функции?
1 ответ
Решение
Это не поведение map
Поведение _
, Это просто ярлык для нормального выражения функции ( в данном случае). В первом случае у вас есть
jsonVal.map(JSONUtil.fromJsonString(x => x.toString(), Blah.jsonReads))
который, очевидно, не работает, и нужно написать полную версию
jsonVal.map(x => JSONUtil.fromJsonString(x.toString(), Blah.jsonReads))