Подтвердить что ты не робот

Как использовать Scala 2.10 неявные классы

Я думал, что это будет правильное использование новых неявных классов 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)?

4b9b3361

Ответ 1

Ключ - это обессоливание неявных классов, объясняемое в 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)

Как вы можете видеть, неявная функция, созданная, имеет то же имя, что и исходные классы. Я предполагаю, что это сделано так, чтобы упростить импорт неявных классов.

Таким образом, когда вы создаете неявный класс case, существует конфликт между именем метода, созданным ключевым словом implicit и сопутствующим объектом, созданным ключевым словом case.

Ответ 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
                         ^

Не уверен, что именно происходит. Но если вы не используете case class, это выглядит нормально:

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

11.twice  // ok