Scala系统学习(三):Scala基础语法
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易。Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的。
当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。现在我们简单地看一下类,对象,方法和实例变量的含义。
- 对象 - 对象有状态和行为。一个对象是类的一个实例。例如 - 狗有状态:颜色,名称,品种,它行为有:摇摆,吠叫和吃东西。
- 类 - 可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
- 方法 - 一个方法基本上是一种行为。一个类可以包含很多方法。将逻辑代码写入方法中,数据在方法中操纵并且执行所有的动作。
- 字段 - 每个对象都有其唯一的一组实例变量,称为字段。对象的状态是由分配给这些字段的值来创建的。
- 闭包 - 闭包是一个函数,其返回值取决于在此函数之外声明的一个或多个变量的值。
- 特征 - 特征(Traits)封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们,特征(Traits)用于通过指定支持的方法的签名来定义对象类型。
第一个Scala项目
如果您熟悉Java语言语法和编程,那么学习Scala将会很容易。Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的。
当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。现在我们简单地看一下类,对象,方法和实例变量的含义。
- 对象 - 对象有状态和行为。一个对象是类的一个实例。例如 - 狗有状态:颜色,名称,品种,它行为有:摇摆,吠叫和吃东西。
- 类 - 可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
- 方法 - 一个方法基本上是一种行为。一个类可以包含很多方法。将逻辑代码写入的方法中,数据在方法中操纵并且执行所有的动作。
- 字段 - 每个对象都有其唯一的一组实例变量,称为字段。对象的状态是由分配给这些字段的值来创建的。
- 闭包 - 闭包是一个函数,其返回值取决于在此函数之外声明的一个或多个变量的值。
- 特征 - 特征(Traits)封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们,特征(Traits)用于通过指定支持的方法的签名来定义对象类型。
第一个Scala项目
我们可以通过两种模式执行Scala程序:
- 交互模式
- 脚本模式
1. 交互模式
打开命令提示符并使用以下命令打开Scala。
注意: 需要先下载: scala-2.12.x.tgz ,下载地址: http://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz ,并解压到一个目录,这里解压到:D:\software\ ,
打开命令提示符进入到目录:D:\software\scala-2.12.3\bin 执行如下命令运行程序 -
D:\software\scala-2.12.\bin> scala
Welcome to Scala 2.12. (Java HotSpot(TM) -Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help. scala> println("Hello, Scala!");
Hello, Scala! scala>
2. 脚本模式
使用以下说明在脚本模式下编写Scala程序。打开记事本创建一个源文件:HelloWorld.scala,保存在目录:D:\software\scala-2.12.3\bin 下,并在其中编写以下代码 -
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
*/
def main(args: Array[String]) {
println("Hello, world!") // prints Hello World
}
}
打开命令提示符窗口并转到保存程序文件的目录。使用'scalac'命令编译Scala程序,它将在当前目录中生成一些类文件。其中一个将被编译生成为HelloWorld.class。 这是一个使用'scala'命令在Java虚拟机(JVM)上运行的字节码。
使用以下命令来编译和执行Scala程序及输出结果如下 -
D:\software\scala-2.12.\bin>scalac HelloWorld.scala D:\software\scala-2.12.\bin>scala HelloWorld
Hello, world! D:\software\scala-2.12.\bin>
基础语法
以下是Scala编程中的基本语法和编码约定。
- 区分大小写 - Scala是区分大小写的,比如标识符
Hello和hello在Scala中表示不同的含义(对象)。 类名称 - 对于所有类名,第一个字母应为大写。如果使用多个单词来形成类的名称,则每个内部单词的第一个字母应该是大写。
示例 -class MyFirstScalaClass,class Employee类等。方法名称 - 所有方法名称应以小写字母开头。如果使用多个单词形成方法的名称,则每个内部单词的第一个字母应为大写。
示例 -def myMethodName(),def getName()等。程序文件名 - 程序文件的名称应与对象名称完全匹配。保存文件时,您应该使用对象名称保存它(记住Scala是区分大小写的),并将
.scala附加到文件名称的末尾。 (如果文件名和对象名不匹配,则程序将不会编译)。
示例 - 假设HelloWorld是对象名称。 那么文件应该保存为HelloWorld.scala。def main(args:Array [String]) - Scala程序从
main()方法开始,这是每个Scala程序的强制性部分。
Scala标识符
所有Scala组件都需要名称。用于对象,类,变量和方法的名称称为标识符。关键字不能用作标识符,标识符区分大小写。Scala支持四种类型的标识符。
字母数字标识符
字母数字标识符以字母或下划线开头,后面可以有更多的字母,数字或下划线。 $字符是Scala中的保留关键字,不应在标识符中使用。
以下是合法的字母数字标识符 -
age, salary, _value, __1_value
以下是非法标识符 -
$salary, 123abc, -salary
运算符标识符
运算符标识符由一个或多个运算符字符组成。运算符字符是可打印的ASCII字符,如:+,:,?,~或#。
以下是合法运算符标识符 -
+ ++ ::: <?> :>
Scala编译器将在内部将操作符标识符转换成具有嵌入式$字符的合法Java标识符。例如,标识符:->将被内部表示为$colon$minus$greater。
混合标识符
混合标识符由字母数字标识符组成,后面跟着一个下划线和一个操作符标识符。
以下是合法的混合标识符 -
unary_+, myvar_=
这里,一元_+用作方法名称定义一个一元的+运算符,而myvar_=用作方法名定义一个赋值运算符(运算符重载)。
字面识别符
一个文字标识符是一个随意的字符串,包含在后面的勾号(...)中。
以下是合法的文字标识符 -
`x` `<clinit>` `yield`
Scala关键字
以下列表显示Scala中的保留字(关键字),这些保留字不能用作常量或变量或任何其他标识符名称。
| abstract | case | catch | class |
|---|---|---|---|
| def | do | else | extends |
| false | final | finally | for |
| forSome | if | implicit | import |
| lazy | match | new | Null |
| object | override | package | private |
| protected | return | sealed | super |
| this | throw | trait | Try |
| true | type | val | Var |
| while | with | yield | |
| - | : | = | => |
| <- | <: | <% | >: |
| # | @ |
Scala注释
Scala支持与Java类似的单行和多行注释。多行注释可以嵌套,但需要正确嵌套。注释中任何字符都被Scala编译器忽略。
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
* This is an example of multi-line comments.
*/
def main(args: Array[String]) {
// Prints Hello World
// This is also an example of single line comment.
println("Hello, world!")
}
}
空行和空格
只包含空格的行(可能带有注释)称为空行,Scala完全忽略它。标记可以由空格字符和/或注释分隔。
换行字符
Scala是一种面向行的语言,其语句可能以分号(;)或换行符终止。语句结尾处的分号(;)通常是可选的。如果需要,您可以输入一个分号(;),但如果语句在单行上自行显示,则不需要输入。 另一方面,如果在单行上写多个语句,则需要分号。 下面的语法是多个语句的用法。
val s = "hello"; println(s)
Scala包
一个包是一个命名的代码模块。 例如,Lift实用程序包是net.liftweb.util。包声明是源文件中的第一个非注释行,如下所示:
package com.liftcode.stuff
导入Scala软件包,以便在当前的编译范围内引用它们。 以下语句导入scala.xml包的内容 -
import scala.xml._
也可以从scala.collection.mutable包导入单个类和对象,例如:HashMap,
import scala.collection.mutable.HashMap
可以从单个包导入多个类或对象,例如,来自scala.collection.immutable包的TreeMap和TreeSet -
import scala.collection.immutable.{TreeMap, TreeSet}
应用动态
一个能够进行动态调用的标记特征。此特征的实例x允许方法调用x.meth(args)用于任意方法名称和参数列表args以及对任意字段名称字段的字段访问x.field。此功能在Scala-2.10中引入。
如果调用不是由本机支持的(即,如果类型检查失败),则根据以下规则重写:
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = , ) ~~> foo.applyDynamicNamed("method")(("x", ), ("", ))
foo.field ~~> foo.selectDynamic("field")
foo.varia = ~~> foo.updateDynamic("varia")()
foo.arr() = ~~> foo.selectDynamic("arr").update(, )
foo.arr() ~~> foo.applyDynamic("arr")()
Scala系统学习(三):Scala基础语法的更多相关文章
- 学习java之基础语法(三)
学习java之基础语法(三) java运算符 计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运 ...
- 《Java程序设计》第三章-基础语法
20145221<Java程序设计>第三章-基础语法 总结 教材学习内容总结 类型.变量与运算符 类型 Java可区分为基本类型(Primitive Type)和类类型(Class Typ ...
- Java学习笔记之---基础语法
Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...
- 学习java之基础语法(一)
学习java之基础语法(一) 基本语法 编写 Java 程序时,应注意以下几点: 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hello 与 hello 是不同的. 类名:对于所有的类来说 ...
- Scala系统学习(二):Scala开发环境安装配置
Scala可以安装在任何基于UNIX/Linux或基于Windows的系统上.在您的机器上开始安装Scala之前,必须在计算机上安装Java 1.8或更高版本. 下面请按照以下步骤安装Scala. 步 ...
- Scala系统学习(一):Scala概述
Scala是可扩展语言的缩写,是一种混合功能编程语言. 它由Martin Odersky创建. Scala顺利整合面向对象和函数式语言的功能. Scala被编译后在Java虚拟机上运行. 许多现有公司 ...
- Scala - 快速学习01 - Scala简介
Scala简介 Scala(Scalable Language)是一门多范式(multi-paradigm)编程语言,Scala的设计吸收借鉴了许多种编程语言的思想,具备面向对象编程.函数式编程等特性 ...
- Java基础知识二次学习-- 第二章 基础语法与递归补充
第二章 基础语法与递归补充 时间:2017年4月24日10:39:18 章节:02章_01节,02章_02节 视频长度:49:21 + 15:45 内容:标识符,关键字与数据类型 心得:由字母,下 ...
- Hive学习笔记:基础语法
Hive基础语法 1.创建表 – 用户表 CREATE [EXTERNAL外部表] TABLE [IF NOT EXISTS 是否存在] HUserInfo ( userid int comment ...
随机推荐
- linux源码编译安装php出现 cannot find -lltdl
原因: 在编辑php时添加的“–with-mcrypt”选项造成. 解决方法: 1.如果不需要mcrypt,那么编辑php时去掉该选项,然后再make.make install. 2.如果需要mcry ...
- OAuth网络协议(转)
一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...
- Python Tkinter 学习成果:点歌软件music
笔者工作业余时间也没什么爱好,社交圈子也小,主要娱乐就是背着自己带电瓶的卖唱音响到住地附近找个人多的位置唱唱KtV. 硬件上点歌就用笔记本电脑,歌曲都是网上下载的mkv格式的含有两个音轨的视频.因此点 ...
- smali-2.2.4.jar & baksmali-2.2.4.jar
https://bitbucket.org/JesusFreke/smali/downloads/
- sencha touch list + carousel scrollable(与其他控件共用滚动条)
有些时候我们需要实现这种效果 上边是一张图片或者一个跑马灯控件,这个布局实现起来比较容易 但是如何让他们共用一个滚动条,来实现以下效果就比较麻烦了. 在官方论坛查找资料得知,可以用以下写法实现: /* ...
- tcp连接的状态变迁以及如何调整tcp连接中处于time_wait的时间
一.状态变迁图 二.time_wait状态 针对time_wait和close_wait有个简单的描述帮助理解: Due to the way TCP/IP works, connections ca ...
- Unity3D Mecanim :Body Mask的使用、 角色Retargeting原理分析、Apply RootMotion
一.Body Mask的使用 1.1.配置好骨骼后通过Muscles来微调角色骨骼中的运动范围,以避免角色在动画中的不正确的叠加或失真等现象. 1.2.身体遮罩BodyMask更形象的描述就是身体的开 ...
- HTML中块级元素与内联元素有什么区别 ?
块级元素:默认宽度是100%(继承自父元素),如果块对象没有采用“float:left”或“float:right;”的样式,相邻的两个块对象就会分排在不同的两行上.例如,div, p, h1, fo ...
- Hive desc
Describe Database hive> DESCRIBE DATABASE test; test ??? hdfs://ns1/user/hive/warehouse/test.db w ...
- nginx配置虚拟主机之不同端口和不同IP地址
配置nginx虚拟主机不同端口和不同ip地址,和上编nginx基于域名配置虚拟主机博文类似,请先参考. zxl.com域名不同端口,配置文件内容如下: 1 2 3 4 5 6 7 8 9 10 11 ...