Scala相当于C#的扩展方法?

时间:2010-06-25 16:06:39

标签: scala extension-methods

在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中这个简单的extension method怎么样?

5 个答案:

答案 0 :(得分:69)

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

答案 1 :(得分:56)

从Scala的2.10版本开始,可以使整个类符合隐式转换的条件

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

此外,可以通过扩展AnyVal

来避免创建扩展类型的实例
implicit class RichInt(val i: Int) extends AnyVal {
  def square = i * i
}

有关隐式类和AnyVal,限制和怪癖的更多信息,请参阅官方文档:

答案 2 :(得分:9)

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

答案 3 :(得分:2)

在Scala中,我们使用所谓的(由该语言的发明者) Pimp My Library 模式,如果你使用字符串,这在网上很容易讨论并很容易找到(不是关键词)搜索。

答案 4 :(得分:0)

Scala 3现在具有扩展方法。功能上似乎与C#和Kotlin相似。

https://dotty.epfl.ch/docs/reference/contextual/extension-methods.html
https://github.com/scala/scala
https://github.com/lampepfl/dotty

最近(截至本文),pull显示语法已简化。截至本文发布时,稳定版本仍为2.x。但是有一个3.xRC,我注意到Jetbrains已经在Idea中支持了它,我认为是部分原因。