13

これは、Scala 2.10 の新しい暗黙のクラスの正しい使い方だと思いました。

implicit case class IntOps(i: Int) extends AnyVal {
  def twice = i * 2
}

11.twice

どうやらそうではありません:

<console>:13: error: value twice is not a member of Int
              11.twice
                 ^

何か不足していますか (Scala 2.10.0-M6)?

4

2 に答える 2

21

手がかりは、 SIP-13で説明されている暗黙のクラスの脱糖です。

implicit class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}

コンパイラによって次のように変換されます。

class RichInt(n: Int) extends Ordered[Int] {
def min(m: Int): Int = if (n <= m) n else m
...
}
implicit final def RichInt(n: Int): RichInt = new RichInt(n)

ご覧のとおり、作成された暗黙関数は元のクラスと同じ名前です。暗黙のクラスをインポートしやすくするために、このようにしていると思います。

したがって、あなたの場合、暗黙的なケースimplicitクラスを作成すると、キーワードによって作成されたメソッド名と、キーワードによって作成されたコンパニオン オブジェクトの間に競合が発生しますcase

于 2012-08-13T11:23:30.980 に答える
2

これは、あいまいさがあることを示しています。

val ops: IntOps = 11

<console>:11: error: ambiguous reference to overloaded definition,
both method IntOps of type (i: Int)IntOps
and  object IntOps of type IntOps.type
match argument types (Int) and expected result type IntOps
       val ops: IntOps = 11
                         ^

正確に何が起こるかわかりません。しかし、 a を使用しない場合はcase class問題ないようです。

implicit class IntOps(val i: Int) extends AnyVal {
  def twice = i * 2
}

11.twice  // ok
于 2012-08-13T09:42:55.300 に答える