在Scala中實現一個簡單的有理數(Rational)類,并對其進行加法、比較等基本操作.
有理數的定義
????????有理數是可以表示為兩個整數的比值的數,通常形式為 n / d,其中 n 是分子,d 是分母。為了確保我們的有理數始終處于最簡形式,我們將在構造函數中計算最大公約數,并將分子和分母分別除以這個值。
package ScalaBianchengimport avro.shaded.com.google.common.math.IntMath.gcdobject Scala06_Rational {/*** @描述: 實現的功能,將對有理數的各項行為進行建模,并進行加減乘除* 《scala編程》 第六章* 函數式對象 - 類-構造方法* 定義類Rational,類參數為n,d,Scala編譯器會接收到這兩個類參數,并且創建一個主構造方法,接收同樣的這兩個參數,* 凸顯出Java與Scala的不同,再Java中,類有構造方法,構造方法可以接收參數,而在Scala中,類可以直接接收參數,* 在scala中,類定義體內可以直接使用類參數,不需要定義字段并編寫將構造方法參數賦值給字段的代碼。* @param n* @param d*/class Rational(n: Int, d: Int) { //n,d是類參數require(d != 0, "分母不能為0")//私有字段,保證為正數所以是abs//分子分母絕對值的最大公約數private val gongyueshu = gcd(n.abs, d.abs)// 類參數值除以最大公約數得到最簡的分數val number = n / gongyueshuval denom = d / gongyueshu// toString 實現打印分子和分母,通過給Rational類添加toString方法重寫默認的實現,// override修飾符表示前一個方法定義被重寫覆蓋了override def toString: String = number + "/" + denomdef add(that: Rational): Rational =new Rational(number * that.denom + that.number * denom, denom * that.denom)//自引用,關鍵字this指向當前執行方法的調用對象,當被用在構造方法里的時候,指向被構造的對象實例//這里面的this 可以省略def lessThan(that: Rational) =this.number * that.denom < that.number * this.denom// 第一個this可以省略,第二個this不能省略 省略了就沒結果了def max(that: Rational) =if (this.lessThan(that)) that else this/*** scala的輔助構造方法,--- > 主構造方法之外的方法稱為輔助構造方法.* 每個輔助構造方法都必須首先調用同一個類的另一個構造方法,他的格式必須是 this(......)* 并且被調用的構造方法要么是主構造方法,要么是另一個發起調用前的輔助構造方法,也就是scala的每個構造方法都會調用到這個累的主構造方法,* 即主構造方法是類的單一入口* 在Java中,構造方法要么調用同一個類的另一個構造方法,要么直接調用超類的構造方法。** @param n*/def this(n: Int) = this(n, 1) //接收一個分子參數/*** 定義操作符,標識符......*/}/*** 執行** @param args*/def main(args: Array[String]): Unit = {val half = new Rational(1, 2)val half2 = new Rational(3, 4)val half3 = new Rational(88, 100)//從對象外部訪問分子分母的值println(half.denom)println(half.number)println(half)//定義的加法println(half add (half2))//最大公約數驗證println(half3)val x = new Rational(4, 5)println(x)}}
????????在 Rational
類中,定義一個主構造函數,兩個參數:分子 n
和分母 d
。使用 require
語句確保分母不為零.
參考
《scala編程》?