2016-03-15 3 views
1

Вот пример кода. Не знаю, почему я получаю ошибку при использовании умножения. Должен ли я добавить неявное преобразование в Int? Конечно, ответ прост! Благодаряscala: перегрузка операций и неявное преобразование преобразования

class Fraction(val x:Int, val y:Int)  
    {    
     def X = x 
     def Y = y 

     implicit def int2Fraction(n: Int) = Fraction(n, 1) 
     def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y) 
    } 

    object Fraction { 
     def apply(x: Int, y: Int) = new Fraction(x, y) 
    } 

    val x : Int = 3 
    val result = x * Fraction(4, 5) 
    println(result.X) 

enter image description here

+0

Какая ошибка? –

+0

Обновлено. Просто обновите страницу – Pavel

ответ

2

Для неявного преобразования иметь место, оно должно находиться в области видимости. Попытайтесь взять его вне класса следующим образом:

implicit def int2Fraction(n: Int) = Fraction(n, 1) 

class Fraction(val x:Int, val y:Int) 
{ 
    def X = x 
    def Y = y 


    def *(that: Fraction) : Fraction = new Fraction(that.X * X, that.Y * Y) 
} 

object Fraction { 
    def apply(x: Int, y: Int) = new Fraction(x, y) 
} 

Вы также можете поместить его внутрь объекта-компаньона; компилятор ищет там автоматически.

+0

Правильный ответ. Имеет смысл сохранить преобразование вне определения класса. Есть ли причина, почему имплициты не ограничены по объему одноэлементных связей? – Pavel

+0

Потому что вы можете использовать разные неявные преобразования для разных областей/контекстов. Вы можете интерпретировать один и тот же объект по-разному с учетом области действия (по какой-либо причине), а затем вы можете импортировать правильное преобразование в каждой области. – ale64bit

4

Ваша неявная функция преобразования является членом класса фракции - поэтому он не может быть вызван без экземпляра Fraction. Если переместить ее в object, он будет работать, как ожидалось:

object Fraction { 
    def apply(x: Int, y: Int) = new Fraction(x, y) 
    implicit def int2Fraction(n: Int) = Fraction(n, 1) 
} 
+0

Ох .. Я вижу, Это реальный ответ. Кстати, это очень очевидно! – Pavel

Смежные вопросы