回答:
バージョン2.10から、Scalaはこの問題を正確に処理するための暗黙のクラスを導入しました。
これにより、指定された型からラップされたクラスへの暗黙的な変換が実行され、独自のメソッドと値を含めることができます。
特定のケースでは、次のようなものを使用します。
implicit class RichInt(x: Int) {
def isAFactorOf(y: Int) = x % y == 0
}
2.isAFactorOf(10)
// or, without dot-syntax
2 isAFactorOf 10
コンパイルすると、これにより、生の値がにボクシングされることに注意してくださいRichInt(2)
。RichIntをサブクラスとして宣言することでこれを回避できますAnyVal
:
implicit class RichInt(val x: Int) extends AnyVal { ... }
これはボクシングを引き起こしませんが、典型的な暗黙のクラスよりも制限的です。メソッドのみを含むことができ、値や状態は含まれません。
基本的に、Scalaでは、中置形式で関数を呼び出すことはできませんが、型のメソッドを定義することができます。これにより、左側の引数を暗黙的に変換できます。したがって、例として、メソッドisAFactorOf(Intを取得)を持つクラスを定義し、Intを暗黙的にこのクラスのインスタンスに変換できることを示すことができます。
別の質問に対するこの回答/programming//a/3119671を見ると、同等に機能するScalaの構文が表示されます。
implicit class RichInt(i: Int) { def square() = i * i }
。