Начиная с версии 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 { ... }
Это не вызовет бокс, но это более ограничительный, чем типичный неявный класс. Он может содержать только методы, но не значения или состояние.