Scala 基本语法
基本语法
如果您对Java有很好的了解,那么学习Scala将会非常容易。Scala和Java之间最大的语法差异是行结束符’;’是可选的。
当我们考虑Scala程序时,可以将其定义为通过调用彼此的方法进行通信的对象的集合。现在让我们简要地研究一下类,对象,方法和实例变量的含义。
- 对象 -对象具有状态和行为。对象是类的实例。示例-狗的状态-颜色,名称,品种和行为-摇摆,吠叫和进食。
- 类 -可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
- 方法 -方法基本上是一种行为。一个类可以包含许多方法。在编写逻辑,处理数据和执行所有操作的方法中。
- 字段 -每个对象都有其唯一的实例变量集,这些实例变量称为字段。对象的状态由分配给这些字段的值创建。
- 闭包 – 闭包是一个函数,其返回值取决于此函数外部声明的一个或多个变量的值。
- 特性 -特性封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。特性用于通过指定所支持方法的签名来定义对象类型。
第一个Scala程序
我们可以以两种模式执行Scala程序:一种是交互模式,另一种是脚本模式。
互动模式
打开命令提示符,然后使用以下命令打开Scala。
>scala
如果您的系统中安装了Scala,将显示以下输出-
Welcome to Scala 2.13.2 (OpenJDK 64-Bit Server VM, Java 1.8.0_242).
Type in expressions for evaluation. Or try :help.
scala>
在Scala提示符右侧键入以下文本,然后按Enter键-
scala> println("Hello, jc2182!");
它将产生以下结果-
scala> println("Hello, jc2182!");
脚本模式
使用以下说明以脚本模式编写Scala程序。打开记事本,并在其中添加以下代码。
object HelloWorld {
/* This is my first java program.
* This will print 'Hello World' as the output
*/
def main(args: Array[String]): Unit = {
println("Hello, world!") // prints Hello World
}
}
将文件另存为− HelloWorld.scala。
打开命令提示符窗口,然后转到保存程序文件的目录。“scalac”命令用于编译Scala程序,它将在当前目录中生成一些类文件。其中之一将被称为HelloWorld.class。这是一个字节码,将使用“scala”命令在Java虚拟机(JVM)上运行。使用以下命令来编译和执行您的Scala程序。
> scalac HelloWorld.scala
> scala HelloWorld
输出:
Hello, World!
语法说明
以下是Scala编程中的基本语法和编码约定。
- 区分大小写 – Scala是区分大小写的,标识符Hello和hello将在Scala中表示不同的含义。
- 类名称 -对于所有类名称,首字母应为大写。如果使用多个单词构成类的名称,则每个内部单词的首字母应为大写。示例 – class MyFirstScalaClass。
- 方法名称 – 所有方法名称均应以小写字母开头。如果使用多个单词构成方法的名称,则每个内部单词的首字母应为大写。 示例 – def myMethodName()
- 程序文件名 – 程序文件名应与对象名完全匹配。保存文件时,应使用对象名称(记住Scala区分大小写)进行保存,并在名称末尾附加’.scala’。(如果文件名和对象名不匹配,则您的程序将无法编译)。示例 -假设“HelloWorld”是对象名称。然后,该文件应另存为“HelloWorld.scala”。
- def main(args:Array [String]) – Scala程序的处理从main()方法开始,该方法是每个Scala程序的必需部分。
标识符
所有Scala组件都需要名称。用于对象,类,变量和方法的名称称为标识符。关键字不能用作标识符,并且标识符区分大小写。Scala支持四种类型的标识符。
字母数字标识符以字母或下划线开头,其后可以是其他字母,数字或下划线。’$’字符是Scala中的保留关键字,不应在标识符中使用。
以下是合法的字母数字标识符 –
age, salary, _value, __1_value
以下是非法标识符 –
$salary, 123abc, -salary
运算符标识符由一个或多个运算符字符组成。操作符是可打印的ASCII字符,例如+,:,?,~或#。
以下是合法的运算标识符-
+ ++ ::: :>
Scala编译器将在内部“组合”运算符,以将其转换为带有嵌入式字符的合法Java标识符。例如,标识符:->在内部将表示为colon minusgreater。
混合标识符由字母数字标识符组成,其后是下划线和运算符。
以下是合法的混合标识符-
unary_+, myvar_=
在这里,用作方法名称的unary_ +定义了一元+运算符,而用作方法名称的myvar_ =定义了一个赋值运算符(运算符重载)。
文字标识符是用反引号(...
)括起来的任意字符串。
以下是合法的文字标识符-
`x` `<clinit>` `yield`
关键字
下面的列表显示了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支持与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)
包
包是命名的代码模块。例如,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允许对任意方法名称meth和参数列表args的方法调用x.meth(args)以及对任意字段名称field的字段访问x.field。Scala-2.10中引入了此功能。如果x本身不支持某个调用(即,如果类型检查失败),则会根据以下规则重写该调用-
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field ~~> foo.selectDynamic("field")
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10) ~~> foo.applyDynamic("arr")(10)