Scala эквивалент методов расширения C #? - PullRequest
53 голосов
/ 25 июня 2010

В C # вы можете написать:

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

Как будет выглядеть этот простой метод расширения в Scala?

Ответы [ 4 ]

69 голосов
/ 25 июня 2010

Шаблон Pimp My Library аналогичен конструкции:

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)

}

Согласно комментариям @Daniel Spiewak, это позволит избежать размышлений о вызове метода, что будет способствовать повышению производительности:

object MyExtensions {
  class RichInt(i: Int) {
    def square = i * i
  }
  implicit def richInt(i: Int) = new RichInt(i)
}
57 голосов
/ 10 октября 2013

Начиная с версии 2.10 Scala, можно сделать весь класс пригодным для неявного преобразования

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

Кроме того, можно избежать создания экземпляра типа расширения, если он расширяет AnyVal

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

Для получения дополнительной информации о неявных классах и AnyVal, ограничениях и причудах обратитесь к официальной документации:

9 голосов
/ 25 июня 2010

Это будет код после комментария Даниэля .

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 )
    }
}
2 голосов
/ 25 июня 2010

В Scala мы используем так называемый (изобретатель языка) шаблон Pimp My Library , который широко обсуждается и довольно легко найти в Интернете, если вы используете строку (ключевое слово) поиск.

...