`

O'REILLY版《Programming Scala》学习笔记——基础语法部分

阅读更多
Scala 学习笔记
//方法定义格式:
def methodName(param1:String,param2:Stirng):String={
	...
}

返回值类型以及前面的":"可以省略
如果方法体只是一个表达式可以去掉"{}"

Scala必须明确指定类型的场景
1.定义变量的时候必须申明类型,除非这个变量在定义的同时并被赋值
2.所有方法参数必须申明类型
3.以下情况下方法的返回值需要明确定义类型
a.当在方法中明确使用return关键字返回
b.递归方法
c.当一个方法被重载并且当重载的方法调用其他同名方法时需要指定返回类型,如果是调用非同名方法则无需指定返回类型
d.当推断的返回值类型大于你的设想的时候,建议公开的API都指定返回值类型

当一个公共方法为定义范围值类型时,如果改变这个内部方法的实现,这个方法在编译后他的返回值类型可能被修改。
这个情况下如果有已经编译过的客户代码来调用这个方法可能会出错,这时需要重新编译客户端代码。
解决这个问题的最好办法是"公开的API都指定返回值类型"

当方法的返回值类型是自动推断的并且方法体前没有使用"=",Scala将推断这个方法返回类型是Unit
Scala中方法体前有"="被认为是函数定义,如果没有被推断为是一个"procedure"返回类型是Unit
val i=123 //整数类型赋值默认为Int
val l=123L; val ll=123l //如果要赋Long值,需要在添加l或者L,这个和java的规则类似
val b:Byte=127 //变量定义声明类型后可以用合适大小的整数为其赋值
3.14e-5d //Double
3.14e-5D //Double
3.14e-5  //Double,默认
3.14e-5f //Float,要指定为单精度浮点型需要加上f或者F,这个和java的规则类似
3.14e-5F //Float

Tuples 容纳的元素个数1-22
Tuples类型变量实际上是scala.TupleN类的实例
//示例代码 start
def tupleator(x1: Any, x2: Any, x3: Any) = (x1, x2, x3)
val t = tupleator("Hello", 1, 2.3)
println( "Print the whole tuple: " + t )
println( "Print the first item: " + t._1 ) //用t._N得到第N个元素,这里索引从1开始而不是0(索引从1开始是函数式编程的惯例)
println( "Print the second item: " + t._2 )
println( "Print the third item: " + t._3 )
val (t1, t2, t3) = tupleator("World", '!', 0x22)
println( t1 + " " + t2 + " " + t3 )
//示例代码 end
//输出结果:
Print the whole tuple: (Hello,1,2.3)
Print the first item: Hello
Print the second item: 1
Print the third item: 2.3
World ! 34

Some,None是Option的子类,None只是一个对象不是类。
Scala中的空值使用None表示,类似JAVA中的null
Some.get 返回被Some包装的值
None.get 会抛异常 throws a NoSuchElementException
stateCapitals.get("Unknown").getOrElse("Oops2!")  //getOrElse 用法

Scala的类名不用和文件名匹配,包名的定义也不依赖于目录的物理结构
Scala脚本不允许定义包???
Scala中import后的包路径是相对的,只有以"_root_"开始的包路径是绝对路径

Scala基本概念:
1.Scala允许非数字的方法名。+, -, $这些符号都可以作为方法名
2.1 + 2 等同于1 .+(2) 这里1后面必须紧跟一个空格,否则1.被看做是Double。如果方法只有一个参数,可以不用"."和"()"
Scala中方法名、类型名、变量名可以包含ASCII字符,例如字母、数字、下划线(_)、$。单不能包括这些符号:(、)、[、]、{、},这些界定符号也不能包括:`、’、 '、"、.、;、,
Scala一般的定义规则和JAVA类似以一个字母或下划线开头后面可以跟随数字、字母、下划线或者$
$在Scala中有内部含义,不能单独作为定义???

下划线(_)的作用:下划线的存在可以告诉编译器直到下一个空格位置的字符都是定义的一部分。例如val xyz_++= = 1 这里的“xyz_++=”是一个常量的名字,这个表达式的意思就是给常量“xyz_++=”初始化并赋值为1。表达式val xyz++= = 1将编译失败,编译器会看做xyz ++=“xyz”被当成一个变量。
如果下划线后面有操作符(+、-、=等)你不能在后面混合字母和数字,这样是为了防止表达式的含义混淆不清。例如:abc_=123 这个表达式的表示“abc_=123”是一个变量名呢?还是为变量“abc_”赋值为123?
如果标识符以操作符开头,那剩余部分也必须是操作符。
“``”可以用任何字符串来定义标识符。例如val `this is a valid identifier` = "Hello
World!",这里`this is a valid identifier`是一个变量名。有些Scala里的保留字也可以用“``”来转义,例如java.net.Proxy.`type`()

一个无参数的方法定义的时候无需圆括号。
调用一个方法的时候如果不带参数,就不用使用圆括号。例如应该这样List(1, 2, 3).size使用,如果这样调用List(1,2,3).size()就会报错。
However, the length method for java.lang.String does have parentheses in its definition, but Scala lets you write both "hello".length() and "hello".length.
当被调用的方法没有参数或者只有一个参数的时候可以忽略方法名前面的“.”
List(1, 2, 3) size和List(1, 2, 3).size等价

冒号结尾的方法是采用右绑定,其他方法都是左绑定。例如List的::方法
scala> val list = List('b', 'c', 'd')
list: List[Char] = List(b, c, d)
scala> 'a' :: list
res4: List[Char] = List(a, b, c, d)

Scala中if语句可以用来赋值,以下用法类似三元表达式:
val configFile = new java.io.File("~/.myapprc")
val configFilePath = if (configFile.exists()) {
configFile.getAbsolutePath()
} else {
configFile.createNewFile()
configFile.getAbsolutePath()
}

Scala中for的用法:
1.foreach方式:
val dogBreeds = List("Doberman", "Yorkshire Terrier", "Dachshund","Scottish Terrier", "Great Dane", "Portuguese Water Dog")
for (breed <- dogBreeds)
println(breed)

2.Filtering 过滤
for (breed <- dogBreeds
if breed.contains("Terrier")
) println(breed)

for (breed <- dogBreeds
if breed.contains("Terrier");//多个过滤语句用";"分隔
if !breed.startsWith("Yorkshire")
) println(breed)

3.Yielding
//符合过滤条件的元素添加到filteredBreeds 这个list里
val filteredBreeds = for {
breed <- dogBreeds
if breed.contains("Terrier")//for语句使用"{}"包围的时候,多个过滤语句不用";"分隔
if !breed.startsWith("Yorkshire")
} yield breed

for {
breed <- dogBreeds
upcasedBreed = breed.toUpperCase()//upcasedBreed 在for语句里定义的变量(注意:没有使用val)
} println(upcasedBreed)//upcasedBreed这里可以使用前面定义的变量


Scala中没有“break”和“continue”;“&&”、“||”和JAVA中一样是短路操作符号;“==”、“!=”不同于java在Scala中是值比较。
val sundries = List(23, "Hello", 8.5, 'q')
for (sundry <- sundries) {
sundry match {
case i: Int => println("got an Integer: " + i)
case s: String => println("got a String: " + s)
case f: Double => println("got a Double: " + f)
case other => println("got something else: " + other)//other 是匹配其他类型的通配符
}
}

val tupA = ("Good", "Morning!")
val tupB = ("Guten", "Tag!")
for (tup <- List(tupA, tupB)) {
tup match {
  case (thingOne, thingTwo) if thingOne == "Good" =>
    println("A two-tuple starting with 'Good'.")//if做更细粒度的匹配
  case (thingOne, thingTwo) =>
    println("This has two things: " + thingOne + " and " + thingTwo)
}
}

关于模式匹配注意点:如果第一个case条件的匹配范围大于第二个case的范围,那么第二个case将永远不会被到达。这会导致一个编译器错误

//强大的模式匹配,可以直接匹配对象属性
case class Person(name: String, age: Int)
val alice = new Person("Alice", 25)
val bob = new Person("Bob", 32)
val charlie = new Person("Charlie", 32)
for (person <- List(alice, bob, charlie)) {
person match {
case Person("Alice", 25) => println("Hi Alice!")
case Person("Bob", 32) => println("Hi Bob!")
case Person(name, age) =>
println("Who are you, " + age + " year-old person named " + name + "?")
}
}


val BookExtractorRE = """Book: title=([^,]+),\s+authors=(.+)""".r//调用String的r方法将字符串转成正则表达式
val MagazineExtractorRE = """Magazine: title=([^,]+),\s+issue=(.+)""".r
val catalog = List(
"Book: title=Programming Scala, authors=Dean Wampler, Alex Payne",
"Magazine: title=The New Yorker, issue=January 2009",
"Book: title=War and Peace, authors=Leo Tolstoy",
"Magazine: title=The Atlantic, issue=February 2009",
"BadData: text=Who put this here??"
)
for (item <- catalog) {
  item match {
    case BookExtractorRE(title, authors) =>
      println("Book \"" + title + "\", written by " + authors)
    case MagazineExtractorRE(title, issue) =>
      println("Magazine \"" + title + "\", issue " + issue)
    case entry => println("Unrecognized entry: " + entry)
  }
}


Scala中没有checked exceptions,方法定义的时候也没有throws子句。
分享到:
评论

相关推荐

    受激拉曼散射计量【Stimulated-Raman-Scattering Metrology】 附Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效

    MMC整流器技术解析:基于Matlab的双闭环控制策略与环流抑制性能研究,Matlab下的MMC整流器技术文档:18个子模块,双闭环控制稳定直流电压,环流抑制与最近电平逼近调制,优化桥臂电流波形,高效并网运行。,MMC整流器(Matlab),技术文档 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧电压6.6kV 2.控制器采用双闭环控制,外环控制直流电压,采用PI调节器,电流内环采用PI+前馈解耦; 3.环流抑制采用PI控制,能够抑制环流二倍频分量; 4.采用最近电平逼近调制(NLM), 5.均压排序:电容电压排序采用冒泡排序,判断桥臂电流方向确定投入切除; 结果: 1.输出的直流电压能够稳定在25.2kV; 2.有功功率,无功功率稳态时波形稳定,有功功率为3.2MW,无功稳定在0Var; 3.网侧电压电流波形均为对称的三相电压和三相电流波形,网侧电流THD=1.47%<2%,符合并网要求; 4.环流抑制后桥臂电流的波形得到改善,桥臂电流THD由9.57%降至1.93%,环流波形也可以看到得到抑制; 5.电容电压能够稳定变化 ,工作点关键词:MMC

    Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基

    Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法

    STM32F103C8T6 USB寄存器开发详解(12)-键盘设备

    STM32F103C8T6 USB寄存器开发详解(12)-键盘设备

    2011-2020广东21市科技活动人员数

    科技活动人员数专指直接从事科技活动以及专门从事科技活动管理和为科技活动提供直接服务的人员数量

    Matlab Simulink仿真探究Flyback反激式开关电源性能表现与优化策略,Matlab Simulink仿真探究Flyback反激式开关电源的工作机制,Matlab Simulimk仿真

    Matlab Simulink仿真探究Flyback反激式开关电源性能表现与优化策略,Matlab Simulink仿真探究Flyback反激式开关电源的工作机制,Matlab Simulimk仿真,Flyback反激式开关电源仿真 ,Matlab; Simulink仿真; Flyback反激式; 开关电源仿真,Matlab Simulink在Flyback反激式开关电源仿真中的应用

    基于Comsol的埋地电缆电磁加热计算模型:深度解析温度场与电磁场分布学习资料与服务,COMSOL埋地电缆电磁加热计算模型:温度场与电磁场分布的解析与学习资源,comsol 埋地电缆电磁加热计算模型

    基于Comsol的埋地电缆电磁加热计算模型:深度解析温度场与电磁场分布学习资料与服务,COMSOL埋地电缆电磁加热计算模型:温度场与电磁场分布的解析与学习资源,comsol 埋地电缆电磁加热计算模型,可以得到埋地电缆温度场及电磁场分布,提供学习资料和服务, ,comsol;埋地电缆电磁加热计算模型;温度场分布;电磁场分布;学习资料;服务,Comsol埋地电缆电磁加热模型:温度场与电磁场分布学习资料及服务

    ibus-table-chinese-yong-1.4.6-3.el7.x64-86.rpm.tar.gz

    1、文件内容:ibus-table-chinese-yong-1.4.6-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/ibus-table-chinese-yong-1.4.6-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊

    基于51单片机protues仿真的汽车智能灯光控制系统设计(仿真图、源代码)

    基于51单片机protues仿真的汽车智能灯光控制系统设计(仿真图、源代码) 一、设计项目 根据本次设计的要求,设计出一款基于51单片机的自动切换远近光灯的设计。 技术条件与说明: 1. 设计硬件部分,中央处理器采用了STC89C51RC单片机; 2. 使用两个灯珠代表远近光灯,感光部分采用了光敏电阻,因为光敏电阻输出的是电压模拟信号,单片机不能直接处理模拟信号,所以经过ADC0832进行转化成数字信号; 3. 显示部分采用了LCD1602液晶,还增加按键部分电路,可以选择手自动切换远近光灯; 4. 用超声模块进行检测距离;

    altermanager的企业微信告警服务

    altermanager的企业微信告警服务

    MyAgent测试版本在线下载

    MyAgent测试版本在线下载

    Comsol技术:可调BIC应用的二氧化钒VO2材料探索,Comsol模拟二氧化钒VO2的可调BIC特性研究,Comsol二氧化钒VO2可调BIC ,Comsol; 二氧化钒VO2; 可调BIC

    Comsol技术:可调BIC应用的二氧化钒VO2材料探索,Comsol模拟二氧化钒VO2的可调BIC特性研究,Comsol二氧化钒VO2可调BIC。 ,Comsol; 二氧化钒VO2; 可调BIC,Comsol二氧化钒VO2材料:可调BIC技术的关键应用

    C++学生成绩管理系统源码.zip

    C++学生成绩管理系统源码

    基于Matlab与Cplex的激励型需求响应模式:负荷转移与电价响应的差异化目标函数解析,基于Matlab与CPLEX的激励型需求响应负荷转移策略探索,激励型需求响应 matlab +cplex 激励

    基于Matlab与Cplex的激励型需求响应模式:负荷转移与电价响应的差异化目标函数解析,基于Matlab与CPLEX的激励型需求响应负荷转移策略探索,激励型需求响应 matlab +cplex 激励型需求响应采用激励型需求响应方式对负荷进行转移,和电价响应模式不同,具体的目标函数如下 ,激励型需求响应; matlab + cplex; 负荷转移; 目标函数。,Matlab与Cplex结合的激励型需求响应模型及其负荷转移策略

    scratch介绍(scratch说明).zip

    scratch介绍(scratch说明).zip

    深度学习模型的发展历程及其关键技术在人工智能领域的应用

    内容概要:本文全面介绍了深度学习模型的概念、工作机制和发展历程,详细探讨了神经网络的构建和训练过程,包括反向传播算法和梯度下降方法。文中还列举了深度学习在图像识别、自然语言处理、医疗和金融等多个领域的应用实例,并讨论了当前面临的挑战,如数据依赖、计算资源需求、可解释性和对抗攻击等问题。最后,文章展望了未来的发展趋势,如与量子计算和区块链的融合,以及在更多领域的应用前景。 适合人群:对该领域有兴趣的技术人员、研究人员和学者,尤其适合那些希望深入了解深度学习原理和技术细节的读者。 使用场景及目标:①理解深度学习模型的基本原理和结构;②了解深度学习模型的具体应用案例;③掌握应对当前技术挑战的方向。 阅读建议:文章内容详尽丰富,读者应在阅读过程中注意理解各个关键技术的概念和原理,尤其是神经网络的构成及训练过程。同时也建议对比不同模型的特点及其在具体应用中的表现。

    day02供应链管理系统-补充.zip

    该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。

    清华大学104页《Deepseek:从入门到精通》

    这份长达104页的手册由清华大学新闻与传播学院新媒体研究中心元宇宙文化实验室的余梦珑博士后及其团队精心编撰,内容详尽,覆盖了从基础概念、技术原理到实战案例的全方位指导。它不仅适合初学者快速了解DeepSeek的基本操作,也为有经验的用户提供了高级技巧和优化策略。

    MXTU MAX仿毒舌自适应主题源码 苹果CMSv10模板.zip

    主题说明: 1、将mxtheme目录放置根目录 | 将mxpro目录放置template文件夹中 2、苹果cms后台-系统-网站参数配置-网站模板-选择mxpro 模板目录填写html 3、网站模板选择好之后一定要先访问前台,然后再进入后台设置 4、主题后台地址: MXTU MAX图图主题,/admin.php/admin/mxpro/mxproset admin.php改成你登录后台的xxx.php 5、首页幻灯片设置视频推荐9,自行后台设置 6、追剧周表在视频数据中,节目周期添加周一至周日自行添加,格式:一,二,三,四,五,六,日

    基于matlab平台的数字信号处理GUI设计.zip

    运行GUI版本,可二开

Global site tag (gtag.js) - Google Analytics