# 有理数类的表示

### 1.定义Rational

`class Rational(n:Int, d:Int)`

Scala编译器会编译Scala类定义包含的任何不属于类成员和类方法的其它代码，这些代码将作为类的主构造函数。比如，我们定义一条打印消息作为类定义的代码：

```scala> class Rational (n:Int, d:Int) {
| println("Created " + n + "/" +d)
| }
defined class Rational

scala> new Rational(1,2)
Created 1/2
res0: Rational = Rational@22f34036```

### 2.重新定义类的toString方法

```scala> class Rational (n:Int, d:Int) {
| override def toString = n + "/" +d
| }
defined class Rational

scala> val x= new Rational(1,3)
x: Rational = 1/3

scala> val y=new Rational(5,7)
y: Rational = 5/7```

### 3.前提条件检查

``````scala> class Rational (n:Int, d:Int) {
| require(d!=0)
| override def toString = n + "/" +d
| }defined class Rational
scala> new Rational(5,0)
java.lang.IllegalArgumentException: requirement failed at scala.Predef\$.require(Predef.scala:211) ... 33 elided
``````

### 4.添加成员变量

``````class Rational (n:Int, d:Int) {
require(d!=0)
override def toString = n + "/" +d
def add(that:Rational) : Rational = new Rational(n*that.d + that.n*d,d*that.d)}
``````

```class Rational (n:Int, d:Int) {
require(d!=0)
val number =n
val denom =d
override def toString = number + "/" +denom
def add(that:Rational) = new Rational( number * that.denom + that.number* denom, denom * that.denom )}```

``````scala> val oneHalf=new Rational(1,2)
oneHalf: Rational = 1/2

scala> val twoThirds=new Rational(2,3)
twoThirds: Rational = 2/3

scala> oneHalf add twoThirds
res0: Rational = 7/6

scala> oneHalf.number
res1: Int = 1
``````

### 5.自身引用

Scala 也使用this来引用当前对象本身，一般来说访问类成员时无需使用this，比如实现一个lessThan方法，下面两个实现是等效的。

``````def lessThan(that:Rational) = this.number * that.denom < that.number * this.denom
``````

``````def lessThan(that:Rational) = number * that.denom < that.number * denom
``````

``````def max(that:Rational) = if(lessThan(that)) that else this
``````

### 6.辅助构造函数

``````def this(n:Int) = this(n,1)
``````

### 7.私有成员变量和方法

Scala 类定义私有成员的方法也是使用private修饰符，为了实现Rational的规范化显示，我们需要使用一个求分子和分母的最大公倍数的私有方法gcd。同时我们使用一个私有变量g来保存最大公倍数，修改Rational的定义：

``````scala> class Rational (n:Int, d:Int) {
| require(d!=0)
| private val g =gcd (n.abs,d.abs)
| val number =n/g
| val denom =d/g
| override def toString = number + "/" +denom
| def add(that:Rational) =
| new Rational(
| number * that.denom + that.number* denom,
| denom * that.denom
| )
| def this(n:Int) = this(n,1)
| private def gcd(a:Int,b:Int):Int =
| if(b==0) a else gcd(b, a % b)
| }
defined class Rational

scala> new Rational ( 66,42)
res0: Rational = 11/7
``````

### 8.定义运算符

``````class Rational (n:Int, d:Int) {
require(d!=0)
private val g =gcd (n.abs,d.abs)
val numer =n/g
val denom =d/g
override def toString = numer + "/" +denom
def +(that:Rational) = new Rational( numer * that.denom + that.numer* denom, denom * that.denom )
def * (that:Rational) = new Rational( numer * that.numer, denom * that.denom)
def this(n:Int) = this(n,1)
private def gcd(a:Int,b:Int):Int = if(b==0) a else gcd(b, a % b)}
``````

``````scala> val x= new Rational(1,2)
x: Rational = 1/2

scala> val y=new Rational(2,3)
y: Rational = 2/3

scala> x+y
res0: Rational = 7/6

scala> x+ x*y
res1: Rational = 5/6
``````

### 9.Scala中的标识符

Scala的命名规则采用和Java类似的camel命名规则（驼峰命名法），首字符小写，比如toString。类名的首字符还是使用大写。此外也应该避免使用以下划线结尾的标志符以避免冲突。

### 10.方法重载

``````def + (i:Int) = new Rational (numer + i * denom, denom)
``````

### 11.隐式类型转换

``````implicit def intToRational(x:Int) = new Rational(x)
``````

## Scala函数式对象-有理数的更多相关文章

1. Scala学习笔记——函数式对象

用创建一个函数式对象(类Rational)的过程来说明 类Rational是一种表示有理数(Rational number)的类 package com.scala.first /** * Creat ...

2. Scala 基础（5）—— 构建函数式对象

有了 Scala 基础(4)—— 类和对象 的前提,现在就可以来构建一个基于 Scala 的函数式对象. 下面开始构造一个有理数对象 Rational. 1. 主构造方法和辅助构造方法 对于每一个类的 ...

3. Scala编程--函数式对象

本章的重点在于定义函数式对象,也就是说,没有任何可变状态的对象的类.作为运行的例子,我们将创造若干把分数作为不可变对象建模的类的变体.在这过程中,我们会展示给你Scala面向对象编程的更多方面:类参数 ...

4. Scala函数式编程进阶

package com.dtspark.scala.basics /** * 函数式编程进阶: * 1,函数和变量一样作为Scala语言的一等公民,函数可以直接赋值给变量: * 2, 函数更长用的方式 ...

5. Scala实战高手****第5课：零基础实战Scala函数式编程及Spark源码解析

Scala函数式编程 ----------------------------------------------------------------------------------------- ...

6. 9、scala函数式编程-集合操作

一.集合操作1 1.Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的 ...

7. Scala函数式编程（三） scala集合和函数

前情提要: scala函数式编程(二) scala基础语法介绍 scala函数式编程(二) scala基础语法介绍 前面已经稍微介绍了scala的常用语法以及面向对象的一些简要知识,这次是补充上一章的 ...

8. Scala函数式编程（四）函数式的数据结构 上

这次来说说函数式的数据结构是什么样子的,本章会先用一个list来举例子说明,最后给出一个Tree数据结构的练习,放在公众号里面,练习里面给出了基本的结构,但代码是空缺的需要补上,此外还有预留的test ...

9. scala 函数式编程之集合操作

Scala的集合体系结构 // Scala中的集合体系主要包括:Iterable.Seq.Set.Map.其中Iterable是所有集合trait的根trai.这个结构与Java的集合体系非常相似. ...

## 随机推荐

1. BZOJ 2002：Bounce 弹飞绵羊（分块）

2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 14944  Solved: 7598 [Su ...

2. Atcoder 1973：こだわり者いろはちゃん / Iroha's Obsession

C - こだわり者いろはちゃん / Iroha's Obsession Time limit : 2sec / Memory limit : 256MB Score : 300 points Prob ...

3. Codeforces 766C：Mahmoud and a Message（DP）

题目链接:http://codeforces.com/problemset/problem/766/C 题意 有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母 ...

4. nginx负载均衡、nginx ssl原理及生成密钥对、nginx配制ssl

1.nginx负载均衡 新建一个文件:vim /usr/local/nginx/conf/vhost/load.conf写入: upstream abc_com{ip_hash;server 61.1 ...

5. 在学习linux基础入门时的一些问题总结（1）

本周在实验楼完成了<linux基础入门>的21个实验,虽然之前已经学习过linux的相关课程,对linux下的命令也有一些了解和实践,但完成这21个实验以及35个练习题仍然遇到了许多的问题 ...

6. （22）bootstrap 初识 + Font Awesome(字体图标库)

bootstrap作用就是简化布局 bootstrap是基于JQ的,所以内部代码使用的是jq语法 所以要使用bs,必须先倒入 1.head标签内倒入bs的css文件  <link rel=&qu ...

7. hdu6441 Find Integer (费马大定理)

#include<bits/stdc++.h> using namespace std; int main() { int T; scanf("%d",&T); ...

8. python str使用笔记（更新）

判断字符串是否以某个串为结尾: str.endswith(strtmp) 返回True/False >>> strs='aba' >>> strs.endswith ...

9. Linux----版本选择