一.本章要点

  • 标识符由字母,数字或运算符构成
  • 一元和二元操作符其实是方法调用
  • 操作符优先级取决于第一个字符,而结合性取决于最后一个字符
  • 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)
}

Scala学习十一——操作符的更多相关文章

  1. scala学习笔记——操作符

    中置操作符(二元操作符),操作符位于两个参数之间.操作符包括字母,比如to,也可以包括操作符字符,比如1->10,等同于方法调用1.->(10) a 标识符 b 其中的标识符是一个带有两个 ...

  2. Scala学习随笔——Scala起步

    实验楼学习Scala语言的笔记,课程网址为https://www.shiyanlou.com/courses/490 一.Scala简介 Scala 是一门多范式的编程语言,类似于 Java .设计初 ...

  3. 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性

    基于.net的分布式系统限流组件   在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...

  4. Scala学习笔记及与Java不同之处总结-从Java开发者角度

    Scala与Java具有很多相似之处,但又有很多不同.这里主要从一个Java开发者的角度,总结在使用Scala的过程中所面临的一些思维转变. 这里仅仅是总结了部分两种语言在开发过程中的不同,以后会陆续 ...

  5. Scala学习资源

    Scala学习资源: Scala官方网站:http://www.scala-lang.org/ Scala github:https://github.com/scala/scala Twitter ...

  6. Linq学习之操作符

    一.环境搭建 下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境.所以请大家务必按照 搭建这里的环境否则会影响你后面的学习. 我们用到的几张表 通知消息表: 用 ...

  7. 【Todo】【读书笔记】大数据Spark企业级实战版 & Scala学习

    下了这本<大数据Spark企业级实战版>, 另外还有一本<Spark大数据处理:技术.应用与性能优化(全)> 先看前一篇. 根据书里的前言里面,对于阅读顺序的建议.先看最后的S ...

  8. Spark基础-scala学习(一、入门)

    Scala解析器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)->Loop(循环).scala解析器也被称为REPL,会快速编译scal ...

  9. 【转载】 强化学习(十一) Prioritized Replay DQN

    原文地址: https://www.cnblogs.com/pinard/p/9797695.html ------------------------------------------------ ...

随机推荐

  1. SpringCloud-Config通过Java访问URL对敏感词加密解密

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  2. DS博客作业07—查找

    1.本周学习总结 1.1思维导图 1.2学习体会 本章学习了顺序表.树表.哈希表的查找方式,学会计算各种查找方式下的ASL 树表部分的b树和平衡二叉树较为复杂,哈希表相对容易掌握 期末要复习的有点多, ...

  3. LeetCode 41. 缺失的第一个正数(First Missing Positive)

    题目描述 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8 ...

  4. (转载)完成端口(CompletionPort)详解 - 手把手教你玩转网络编程系列之三

    转自:http://blog.csdn.net/piggyxp/article/details/6922277 前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何 ...

  5. 用Python写一个将Python2代码转换成Python3代码的批处理工具

    之前写过一篇如何在windows操作系统上给.py文件添加一个快速处理的右键功能的文章:<一键将Python2代码自动转化为Python3>,作用就是为了将Python2的文件升级转换成P ...

  6. Qt之CMake和MinGW编译OpenCV

    这里编译的是最新版OpenCV3.4.3,编译过程比较曲折,大部分编译错误都可以查得到解决方法,也遇到了Google无果的错误,好在最后还是解决了,特此记录. 编译环境 win10-64bit Qt5 ...

  7. Android的内部存储

    路径:/data/data/包名/ this.getCacheDir() = /data/data/com.example.qq/cache/ getFilesDir() = /data/data/c ...

  8. 007-IP报文协议

    一.概述 IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西,它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求. IP不提供可靠的传输服务,它不提供端 ...

  9. 开题报告中如何将一段文字插入到word表格中

    1,举例如下,打开空白word,设计一个20列的表格.任意一段文字. 2,选中这段文字,点击替换按钮.查找内容为“?”,替换为“^&,”(后面是逗号),并勾选“使用通配符”. 3,全部替换得到 ...

  10. Js 使用Map

    function Map() { this.elements = new Array(); this.size = function() { return this.elements.length; ...