Githup项目LearningSpark代码讲解(十一)

这个是一个比较详细的例子,描述一下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)



}

你可能感兴趣的:(Spark)