62 votes

Équivalent Scala des méthodes d'extension de C #?

En 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 méthode d'extension simple dans Scala?

73voto

Mitch Blevins Points 7646

Le modèle Pimp My Library est une construction analogue:

 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 de réfléchir à l'invocation de méthode, ce qui améliore les performances:

 object MyExtensions {
  class RichInt(i: Int) {
    def square = i * i
  }
  implicit def richInt(i: Int) = new RichInt(i)
}
 

67voto

megri Points 167

Depuis la version 2.10 de la Scala, il est possible de faire toute une classe admissible pour la conversion implicite

implicit class RichInt(i: Int) {
  def square = i * i
}

En outre, il est possible d'éviter la création d'une instance de l'extension type de prolonger AnyVal

implicit class RichInt(val i: Int) extends AnyVal {
  def square = i * i
}

Pour plus d'informations sur l'implicite des classes et AnyVal, les limites et les imperfections, veuillez consulter la documentation officielle:

10voto

OscarRyz Points 82553

Ce serait le code après le commentaire de Daniel.

 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 )
    }
}
 

2voto

Randall Schulz Points 18820

En Scala, nous utilisons le modèle dit de Pimp My Library (par l'inventeur du langage), qui est très discuté et assez facile à trouver sur le Web, si vous utilisez une recherche par chaîne (et non par mot clé).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X