Le Scala élève le type du Integer vers Any et peux les concaténer via :
C'est pas tout à fait ça, toute classe hérite de Any en Scala, et ce code est l'ancienne version et il manque la méthode implicite de conversion qui allait avec :
implicitdefany2stringadd(x:Any):StringAdd
Maintenant ça utilise les implicit class (qui datent de 2.10 je crois ?) pour tout faire en une fois dans Predef :
Y a rien de magique, ce qu'il se passe c'est que le compilateur scala cherche la méthode +(other: String) sur Int, ne la trouve évidemment pas, alors il cherche (entre autres ; pour l'ancienne version il cherchait une méthode implicite prenant en unique paramètre un truc permettant de passer des Int, et ayant pour type de retour un truc ayant une méthode +(other: String)) une classe qui soit implicite, à un seul paramètre de constructeur (de type permettant de passer un Int, ce qu'est Any puisque tout objet est un Any), et disposant d'une méthode +(other: String), ce que any2stringadd est.
Donc il remplace ton 1 + "3a" par :
newany2stringadd(1).+("3a")
Et (rien à voir avec ce qui permet de concaténer des carottes et des String, c'est orthogonal) le extends AnyVal fait de any2stringadd une value class, c'est à dire une classe wrapper que le compilo est encouragé à virer dans le code final. Donc là en l'occurence ce qui arrive à la fin c'est que + est "inlinée" et ça donne au final :
[^] # Re: En Scala
Posté par Sufflope (site web personnel) . En réponse au journal Un print(1 + "3a"), ça nous inspire comment ?. Évalué à 2.
C'est pas tout à fait ça, toute classe hérite de Any en Scala, et ce code est l'ancienne version et il manque la méthode implicite de conversion qui allait avec :
Maintenant ça utilise les implicit class (qui datent de 2.10 je crois ?) pour tout faire en une fois dans Predef :
Y a rien de magique, ce qu'il se passe c'est que le compilateur scala cherche la méthode +(other: String) sur Int, ne la trouve évidemment pas, alors il cherche (entre autres ; pour l'ancienne version il cherchait une méthode implicite prenant en unique paramètre un truc permettant de passer des Int, et ayant pour type de retour un truc ayant une méthode +(other: String)) une classe qui soit implicite, à un seul paramètre de constructeur (de type permettant de passer un Int, ce qu'est Any puisque tout objet est un Any), et disposant d'une méthode +(other: String), ce que any2stringadd est.
Donc il remplace ton 1 + "3a" par :
Et (rien à voir avec ce qui permet de concaténer des carottes et des String, c'est orthogonal) le extends AnyVal fait de any2stringadd une value class, c'est à dire une classe wrapper que le compilo est encouragé à virer dans le code final. Donc là en l'occurence ce qui arrive à la fin c'est que + est "inlinée" et ça donne au final :