web-dev-qa-db-ja.com

Scala C#の拡張メソッドに相当しますか?

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でどのように見えますか?

59
John

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)
}
70
Mitch Blevins

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、制限、および癖の詳細については、公式ドキュメントを参照してください。

59
megri

これは、ダニエルの コメント の後のコードになります。

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

Scalaでは、いわゆる(言語の発明者による)Pimp My Libraryパターンを使用しています。 (キーワードではなく)文字列検索を使用すると、多くの議論が行われ、Web上で簡単に見つけることができます。

2
Randall Schulz