这个是一个比较详细的例子,描述一下scala是如何编写代码的,后面会继续编写这个项目的相关例子的讲解
package scalademo
object Rational{
/**
* 隐式转换,我觉得隐式转换这个功能很重要
* 隐式定义是指编译器为了修正类型错误而允许插入到程序中的定义。例如,如果x+y不能通过类型检查,那么编译器可能会把它改为covert(x)+y,
* 这里的convert是某个可用的隐式转换。如果convert可以吧x改变为某种带了+的东西,那么这种转变可能修复程序以便让他通过类型检查并正确执行。
* 如果convert知识一个非常简单的转换函数,那么从源代码中省略他将有助于代码的净化。
*
* 作用域规则:插入的隐式转换必须以单一标识符的形式处于作用域中,或与转换的源活目标类型关联在一起,scala只考虑处于作用域之内的隐式转换。
*/
implicit def intToRational(i:Int):Rational = new Rational(i)
def main(args: Array[String]): Unit = {
val r = new Rational(3,4)
println(2*r)
}
}
/**
* 这个是编写scala的一个例子,可以当做样例使用
*
* @param n
* @param d
*/
class Rational(n: Int, d: Int) {
//下面这句话是先决条件检查,假如不符合先决条件检查,是无法初始化变量的
require(d != 0)
override def toString: String = n + "/" + d
/**
* 辅助构造器
*/
def this(n:Int) = this(n,1)
/**
* 下面这个写法是错误的,这是为什么?
* def add(that:Rational): Rational ={
* new Rational(n*that.d+d*that.n,d*that.d)
* }
* 我觉得这个问题其实比较重要,我们打印n,m其实是没有任何问题的,但是为什么使用就有问题了,其实这个原因就是n,m不是这个对象的变量
*
*/
val number:Int = n/g
val denom:Int = d/g
def add(that:Rational): Rational ={
new Rational(number*that.denom+denom*that.number,denom*that.denom)
}
/**
* 自指向,这个其实说的就是this这个关键字我觉得,没什么特殊要讲解的东西
*/
def lessThan(that:Rational) = this.number * that.denom < that.number * this.denom
private def gcd(a:Int,b:Int):Int = if(b == 0 ) a else gcd(b,a%b)
private val g = gcd(n.abs,d.abs)
/**
* 下面方法包含方法重载,这部分其实和java一样,我觉得讲述的必要不是很大
*/
def + (that:Rational):Rational = new Rational(number*that.denom+denom*that.number,denom*that.denom)
def + (i:Int):Rational = new Rational(number+i*denom,denom)
def - (that:Rational):Rational = new Rational(number*that.denom-denom*that.number,denom*that.denom)
def - (i:Int):Rational = new Rational(number-i*denom,denom)
def * (that:Rational):Rational = new Rational(number*that.number,denom*that.denom)
def * (i:Int):Rational = new Rational(number*i,denom)
def / (that:Rational):Rational = new Rational(number*that.denom,denom*that.number)
def / (i:Int):Rational = new Rational(number,denom*i)
}