I am trying sample programs on Scala implicits. I am trying to implement one solution from the "Scala for the Impatient" book.
I have written as Fraction class having two member variables numerator and denominator with an operation overloading method "*(fraction)", so that we can call multiplication on Fraction objects like fration1 * fraction2 * fraction3.
Now, I tried to implement intToFraction and fractionToInt implicit methods, so that we can also write syntax like 2fraction13. I tried implementing those methods in companion object of Fraction class. But those methods are not getting called.
As suggested by Scala docs, Scala compiler will try to find out implicit implementation in the companion object. Here, we are performing operation on objects of Fraction class, so I assume, implicits declared in Fraction should have been called automatically. I also tried by importing implicit methods explicitly but it did not work.
Please find code snippet below for your reference.
package com.example.implicits.conversion
object ImplicitConversionTester extends App {
val f1 = Fraction(4,2)
val result = 2 * f1
println(s"${f1 * f1}")
println(s"${result}")
}
class Fraction(val numerator : Int,val denominator : Int) {
def *(fraction : Fraction): Fraction = {
println("##### Call to operator overloading *")
Fraction(this.numerator*fraction.numerator, this.denominator*fraction.denominator)
}
override def toString: String = s"Fraction($numerator,$denominator) ===== ${numerator/denominator}"
}
object Fraction {
def apply(numerator: Int, denominator: Int): Fraction = new Fraction(numerator, denominator)
implicit def intToFraction(num : Int) = {
println("##### intToFraction")
Fraction(num,1)
}
implicit def fractionToInt(fr : Fraction) = {
println("##### fractionToInt")
fr.numerator/fr.denominator
}
}
any suggestion to fix this problem appreciated!
