15

私のライブラリのいくつかの scala-doc を見ると、値クラスからの不要なノイズがあるように見えました。例えば:

implicit class RichInt(val i: Int) extends AnyVal {
  def squared = i * i
}

これにより、不要なシンボルが導入されますi

4.i   // arghh....

そのようなものは、scala docs と IDE オートコンプリートの両方に表示されますが、これは本当に良くありません。

それで...この問題を軽減する方法のアイデアはありますか? 私はあなたが使用できることを意味しますがRichInt(val self: Int)、それはそれをより良くしません(4.self、wth?)


編集

次の例では、コンパイラは中間オブジェクトを消去しますか?

import language.implicitConversions

object Definition {
  trait IntOps extends Any { def squared: Int }
  implicit private class IntOpsImpl(val i: Int) extends AnyVal with IntOps {
    def squared = i * i
  }
  implicit def IntOps(i: Int): IntOps = new IntOpsImpl(i)  // optimised or not?
}

object Application {
  import Definition._
  // 4.i  -- forbidden
  4.squared
}
4

5 に答える 5

2

シャドウされた名前を使用する可能性があります。

implicit class IntOps(val toInt: Int) extends AnyVal {
  def squared = toInt * toInt
}

または

implicit class IntOps(val toInt: Int) extends AnyVal { ops =>
  import ops.{toInt => value}
  def squared = value * value
}

これは依然として scala-docs に記載されますが、少なくとも呼び出し4.toIntは混乱せず、実際にトリガーすることもありませんIntOps

于 2013-07-30T17:48:19.547 に答える