Vous pouvez le faire pour obtenir des conversions implicites à la chaîne:enchaînant les conversions implicites en toute sécurité
package language
object chainedImplicits {
implicit def chainImplicits[A, B, C](a: A)(implicit conv1: A => B, conv2: B => C): C = conv2(conv1(a))
}
mais ce n'est évidemment pas sûr.
Je ne vois rien de mal avec cette version, bien que:
package language
package chainedImplicits {
final class Chained[A, B] private[chainedImplicits] (val f: A => B)
trait Low { this: `package`.type =>
implicit def startChaining(implicit conv: A => B): Chained[A, B] = new Chained[A, B](conv)
implicit def chainImplicits[A, B, C](implicit conv1: Chained[A, B], conv2: B => C): Chained[B, C] = new Chained(conv1.f andThen conv2)
}
}
package object chainedImplicits extends Low {
implicit def endChain[A, B](a: A)(implicit conv: Chained[A, B]): B = conv.f(a)
}
est-il un piège ici?
Pourquoi le premier bloc de code d'un code évidemment pas sûr? Scala pourrait-il créer une chaîne infinie d'implicits en instanciant '' A'' et '' C'' avec le même type concret? –
@mhs Non, car Scala n'appelle une conversion implicite que si le code ne vérifie pas le type. Le danger avec le premier est que les chaînes d'implicits pourraient ne pas être uniques signature finale modulo. –