J'essaie de comprendre pourquoi exactement une conversion implicite fonctionne dans un cas, mais pas dans l'autre. Voici un exemple:Conversions implicites bizarrerie
case class Wrapper[T](wrapped: T)
trait Wrapping { implicit def wrapIt[T](x: Option[T]) = x.map(Wrapper(_))
class NotWorking extends Wrapping { def foo: Option[Wrapper[String]] = Some("foo") }
class Working extends Wrapping {
def foo: Option[Wrapper[String]] = {
val why = Some("foo")
why
}
}
Fondamentalement, j'ai une conversion implicite Option[T]
-Option[Wrapper[T]]
, et essaie de définir une fonction, qui renvoie une chaîne optionnelle, qui est enveloppé implicitement.
La question est pourquoi, lorsque je tente de retourner Option[String]
directement (NotWorking
ci-dessus), je reçois une erreur (found : String("foo") required: Wrapper[String]
), qui disparaît si je cède le résultat à un val avant de le retourner.
Ce qui donne?