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でどのように見えますか?
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)
}
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、制限、および癖の詳細については、公式ドキュメントを参照してください。
これは、ダニエルの コメント の後のコードになります。
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 )
}
}
Scalaでは、いわゆる(言語の発明者による)Pimp My Libraryパターンを使用しています。 (キーワードではなく)文字列検索を使用すると、多くの議論が行われ、Web上で簡単に見つけることができます。