写一个类测试一下Scala中的隐式转换的用法:
class Fraction(n: Int, d: Int) {
// def den = d
private val den = d;
// def num = n 类参数定义为方法或字段都可以
private val num = n;
// 定义乘法
def *(other: Fraction) = Fraction(other.num * this.num, other.den * this.den)
// 重写toString
override def toString() = s"$num / $den"
}
//伴生对象
object Fraction {
// implicit隐转 方法名无关可以随意改,自动调用
implicit def int2Fraction(n: Int) = Fraction(n, 1)
def apply(n: Int, d: Int) = {
new Fraction(n, d)
}
def unapply(frac: Fraction) = if (frac.den == 0) None else Some((frac.num, frac.den))
}
object TestFrac extends App{
// 3 隐式调用了int2Fraction方法被转化为一个Fraction对象Fraction(3,1)
val result = 3 * Fraction(4,5)
// 也可以显示调用
val result2 = Fraction.int2Fraction(5) * Fraction(3,4)
println(result)
// unapply
val Fraction(num,den) = result
println(num,den)
}