object Rationals { // primary constuctor class Rational(x :Int, y: Int) { require(y != 0, "denominator must be non zero") // throws IllegalArgumentException assert(y != 0) // throws AssertionError // another constructor def this(x: Int) = this(x, 1) private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) private val g = gcd(x, y) def numer = x / g def denom = y / g def unary_- = new Rational(-numer, denom) def < (that: Rational) = this.numer * that.denom < that.numer * this.denom def max(that: Rational) = if (this < (that)) that else this def + (that: Rational) = new Rational( numer * that.denom + that.numer * denom, denom * that.denom) def - (that: Rational) = this + -that override def toString = numer + "/" + denom } def run = { println("Rationals") println(new Rational(2, 3) + (new Rational(3, 4)) toString) println(new Rational(1, 3) - (new Rational(5 ,7)) - (new Rational(3, 2)) toString) println(new Rational(1, 3) max (new Rational(5 ,7)) toString) } }