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?

51
demandé sur Peter Mortensen 2010-06-25 20:06:39

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)
}
66
répondu Mitch Blevins 2013-05-31 23:12:08

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:

50
répondu megri 2013-10-10 13:59:08

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 )
    }
}
9
répondu OscarRyz 2017-05-23 11:47:09

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.

3
répondu Randall Schulz 2010-06-25 16:24:36