Scala эквивалент методов расширения С#?
В С# вы можете написать:
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?
Ответы
Ответ 1
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)
}
Ответ 2
Начиная со версии 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, ограничениях и причудах обратитесь к официальной документации:
Ответ 3
Это будет код после 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 )
}
}
Ответ 4
В Scala мы используем так называемый (автор изобретателем языка) шаблон Pimp My Library, который много обсуждается и довольно легко найти в Интернете, если вы используете поиск по строке (не ключевому слову).