Scalaインフィックス表記法


12

インフィックス表記法を使用してメソッドを呼び出すことは可能ですか?

たとえば、Haskellでは、次の関数を作成できます。

x `isAFactorOf` y = x % y == 0

そして次のように使用します:

if 2 `isAFactorOf` 10 ...

場合によっては非常に読みやすいコードが可能になります。Scalaでこれに似たものはありますか?「Scala infix notation」を検索しましたが、その用語はScalaでは異なるものを意味するようです。

回答:


15

バージョン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 { ... }

これはボクシングを引き起こしませんが、典型的な暗黙のクラスよりも制限的です。メソッドのみを含むことができ、値や状態は含まれません。


2
おそらく、暗黙のクラスをトップレベルにすることはできないので、暗黙のクラスをローカルで定義する必要があることに言及する必要があります。
発癌性14

3

基本的に、Scalaでは、中置形式で関数を呼び出すことはできませんが、型のメソッドを定義することができます。これにより、左側の引数を暗黙的に変換できます。したがって、例として、メソッドisAFactorOf(Intを取得)を持つクラスを定義し、Intを暗黙的にこのクラスのインスタンスに変換できることを示すことができます。

別の質問に対するこの回答/programming//a/3119671を見ると、同等に機能するScalaの構文が表示されます。


Scalaの新しいバージョンには、このための明示的な構造がありますが、リンクされた回答では対応していませんimplicit class RichInt(i: Int) { def square() = i * i }
KChaloux 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.