L'équivalent Scala des méthodes d'extension de C#?
dans C# vous pouvez écrire:
using System.Numerics;
namespace ExtensionTest {
public static class MyExtensions {
public static BigInteger Square(this BigInteger n) {
return n * n;
}
static void Main(string[] args) {
BigInteger two = new BigInteger(2);
System.Console.WriteLine("The square of 2 is " + two.Square());
}
}}
à quoi ressemblerait cette simple méthode d'extension dans Scala?
4 réponses
the Pimp My Library pattern is the analogical construction:
object MyExtensions {
implicit def richInt(i: Int) = new {
def square = i * i
}
}
object App extends Application {
import MyExtensions._
val two = 2
println("The square of 2 is " + two.square)
}
selon les commentaires de @Daniel Spiewak, cela évitera la réflexion sur l'invocation de la méthode, l'aide à la performance:
object MyExtensions {
class RichInt(i: Int) {
def square = i * i
}
implicit def richInt(i: Int) = new RichInt(i)
}
depuis la version 2.10 de Scala, il est possible de rendre une classe entière éligible à la conversion implicite
implicit class RichInt(i: Int) {
def square = i * i
}
de plus, il est possible d'éviter de créer une instance du type extension en la faisant étendre AnyVal
implicit class RichInt(val i: Int) extends AnyVal {
def square = i * i
}
pour plus d'informations sur les classes implicites et AnyVal, les limitations et les bizarreries, consultez la documentation officielle:
ce serait le code après le de Daniel" comment .
object MyExtensions {
class RichInt( i: Int ) {
def square = i * i
}
implicit def richInt( i: Int ) = new RichInt( i )
def main( args: Array[String] ) {
println("The square of 2 is: " + 2.square )
}
}
en Scala nous utilisons le soi-disant (par l'inventeur de la langue) Pimp Ma bibliothèque motif, qui est beaucoup discuté et assez facile à trouver sur le Web, si vous utilisez une chaîne de caractères (Pas mot clé) de recherche.