Dalla console attivatore questo funziona:Gioca 2.3 opzioni di scrittura con Json.obj e getOrElse
scala> import play.api.libs.json._
import play.api.libs.json._
scala> val testVal = Some("foo")
testVal: Some[String] = Some(foo)
scala> Json.obj("myJson" -> testVal)
res0: play.api.libs.json.JsObject = {"myJson":"foo"}
Questo funziona anche:
scala> Json.obj("myJson" -> testVal.get)
res3: play.api.libs.json.JsObject = {"myJson":"foo"}
Questo fallisce:
scala> Json.obj("myJson" -> testVal.getOrElse(""))
<console>:12: error: type mismatch;
found : Object
required: play.api.libs.json.Json.JsValueWrapper
Json.obj("myJson" -> testVal.getOrElse(""))
Ma questo opere:
scala> val testVal2 = testVal.getOrElse("")
testVal2: String = foo
scala> Json.obj("myJson" -> testVal2)
res2: play.api.libs.json.JsObject = {"myJson":"foo"}
Perché il compilatore rifiuta il mio terzo esempio? testVal.getOrElse("")
valuta una stringa, quindi perché il compilatore pensa che sia Object
nel terzo esempio sopra?
Credo capire. Sono ancora un po 'confuso sul motivo per cui funziona nel mio ultimo esempio comunque. Perché il compilatore considera il valore "val" in modo diverso rispetto al semplice inserimento dell'espressione 'getOrElse' inline? Valutano la stessa cosa e non c'è dubbio che sarà sempre una stringa. – imagio
Nell'ultimo esempio il tipo viene dedotto come 'String' dall'assegnazione. Ma in linea, il compilatore dedurrà il tipo solo dai parametri di tipo di 'getOrElse'. Ad esempio, non vedremo molto più avanti per vedere se c'è un 'String' letterale lì per vedere se può usare una conversione implicita. –