zoukankan      html  css  js  c++  java
  • Scala学习十一——操作符

    一.本章要点

    • 标识符由字母,数字或运算符构成
    • 一元和二元操作符其实是方法调用
    • 操作符优先级取决于第一个字符,而结合性取决于最后一个字符
    • apply和update方法在对expr(args)表达式求值时被调用
    • 提取器从输入中提取元组或值的序列

    二.标识符

        变量,函数,类的名称统称为标识符。标准的(Java)字符和数字组成的序例,以下划线或者字母开头,以及Unicode字符。

      注:在Scala中,除了标准的,还可以使用任意序列的操作符字符:

        • 除字母、数字、下划线、括号(){}[]或分隔符.,;'"之外的ascii码,如!@#%&等等;
        • Unicode的数学符号,或Unicode的Sm和So类别中的其他符号。如**等
        • 还可以用''包含任意字符(包括关键字),例val 'val'=...

    三.中置操作符

      a 标识符 b,标识符表示一个带有两个参数的方法(一个隐式的参数,一个显式的参数),如1 to 10实际调用的事1.to(10),1->10等同于1.->10,是中置表达式,操作符位于两个参数中间。

      定义操作符,例:

    class Fraction(n:Int,d:Int){
    private int num
    private int den
    def *(other:Fraction)=new Fraction(num * other.num,den*other.den)
    }

    四.一元操作符

      中置操作符是二元的,有两个参数,只有一个参数的操作符称为一元操作符。

      如果出现在参数之后就是后置操作符,如a 标识符,1 toString同于1.toString();+,-,!,~可以作为前置操作符,出现在参数之前,被转换成名为unary_操作符的方法调用,如-a等同于a.unary_-。

    五.赋值操作符

      赋值操作符名称形式为操作符=,如a 操作符=b等同于a=a 操作符 b。例:a+=b等同于a=a+b。

      注:

        • <=、>=、!=不是赋值操作符;
        • 以=开头的操作符不是赋值操作符(==,===,=/=等)
        • 如果a有一个名为操作符=的方法,那么该方法直接引用

    六.优先级

      当一次使用对个操作符,又没有括号,执行顺序按优先级执行。 

     

    七.结合性

      当有一系列相同优先级的操作符时,操作符的结合性决定了它们是从左到右求值还是从右到左求值。

      注:在Scala中,除了以冒号(:)结尾的操作符(例:用于构造列表的::,2::Ni1等同于Ni1.::(2)),赋值操作符以外,都是左结合的  

    八.apply和update方法

      Scala允许f(arg1,arg2,...)调用,如果f不是函数或者方法,则等同于f.apply(arg1,arg2,...),或者出现在等号的左侧如f(arg1,arg2,...)=value等同于f.update(arg1,arg2,...,value)。

      这个机制被用于数组和映射:

    val scores=new scala.collection.mutable.HashMap(String,Int)
    scores("Bob")=100//调用scores.update("Bob",100)
    val bobScore=score["Bob"]//调用scores.apply("Bob")

      apply还常用于伴生对象中,构造对象不用显示的应用new,例:

    class Fraction(n:Int,d:Int){
    ...}
    
    object Fraction{
    def apply(n:Int,d:int)=new Fraction(n,d)
    }

    九.提取器

      提取器就是一个带有unapply方法的对象。可以当作伴生对象apply(接受参数,构造对象)的反向操作,接受一个对象,然后提取值,通常是用来构造该对象的值。

      例:

    var Fraction(a,b)=Fraction(3,4)*Fraction(2,5)
    //a和b分别被初始化称运算结果的分子和分母
    
    case Fraction(a,b)=>...//a和b分别被绑到分子和分母
    
    //模式匹配可能失败,因此unapply方法返回的是一个Option
    object Fraction{
    def unapply(input:Fraction)={
    if (input.den==0) None else Some(input.num,inout.den)}
    
     }

      注:每一个样例类都自动具备apply和unapply方法。

    十.带单个参数或无参的提取器

      在Scala中,没有值带一个组件的元组,如果unapply要提取单值,则应该返回一个目标类型的Option。

      例:

    object Number{
    def unapply(input:String):Option[Int]=
    {
    try{
    Some(Integer.parseInt(inut.trim))
    }
    catch{
    case ex:NUmberFromatException=>None
    }
    }
    }

    十一.unapplySeq方法

      要提取任意长度的值的序列,应该使用unapplySeq来命名。返回一个Option[Seq[A]],其中A是被提取的值的类型,例:

    object Name{
    def unapplySeq(input:String):Option[Seq[String]]=
    if(input.trim=="")None else Some(input.trim.split("\s+"))
    }

      

    十二.练习

         1.左结合,从左往右依次执行

      2.

      3.

    class Fraction {
        var n:Int=_
        var d:Int=_
      def +(that:Fraction):Fraction=Fraction(this.n*that.d+that.n*this.d,this.d*this.d)
      def -(that:Fraction):Fraction=Fraction(this.n*that.d-that.n*this.d,this.d*that.d)
      def *(that:Fraction):Fraction=Fraction(this.n*that.n,this,d*that.d)
      def /(that:Fraction):Fraction=Fraction(this.n*that.d,this.d*that.n)
      def this(n:Int,d:Int){
        this()
        this.n=n
        this.d=d
        simplify()
      }
      def simplify(): Unit ={
        var r=n%d
        if(r==0){
          n/=d
          d=1
        }
        else if(d%r==0){
          n/=r
          d/=r
        }
      }
    
      override def toString: String = 1.0*n/d toString
    
    }
    object Fraction{
      def apply(n:Int,d:Int):Fraction=new Fraction(n,d)
    }
  • 相关阅读:
    对结构体的快速排序问题(用库函数)
    图结构练习——判断给定图是否存在合法拓扑序列(dfs算法(第一个代码),邻接矩阵(前两个代码),邻接表(第三个代码))
    Linux root 密码重置与用户管理
    Linux command’s Array
    linux command intro2 vi
    Linux Commands intro1
    Beeline known issues
    spark加载hadoop本地库的时候出现不能加载的情况要怎么解决呢?
    spark Basic code demo
    HADOOP cluster some issue for installation
  • 原文地址:https://www.cnblogs.com/lyq-biu/p/11964287.html
Copyright © 2011-2022 走看看