Scala 基本语法
如果你对Java有很好的理解,那么学习Scala将会非常容易。Scala和Java之间最大的语法区别是分号 ‘;’ 可选。
当我们考虑一个Scala程序时,它可以被定义为通过调用彼此的方法来相互通信的对象集合。现在让我们简要地了解一下类、对象、方法和实例变量的含义。
- 对象 - 对象具有状态和行为。对象是类的一个实例。例如 – 一只狗具有状态 – 颜色、名字、品种以及行为 – 摇尾巴、叫喊和吃东西。
-
类 - 类可以被定义为描述与类相关的行为/状态的模板/蓝图。
-
方法 - 方法基本上是行为。一个类可以包含多个方法。在方法中编写逻辑,操作数据并执行所有操作。
-
字段 - 每个对象都有其独特的一组实例变量,称为字段。对象的状态是由分配给这些字段的值创建的。
-
闭包 - 闭包是一个函数,其返回值取决于在此函数之外声明的一个或多个变量的值。
-
特质 - 特质封装了方法和字段的定义,然后可以通过将它们混入类中来重用它们。特质用于通过指定受支持方法的签名来定义对象类型。
第一个Scala程序
我们可以以两种模式执行Scala程序:一种是 交互模式 ,另一种是 脚本模式 。
交互模式
打开命令提示符,使用以下命令打开Scala。
>scala
如果Scala已安装在您的系统中,则会显示以下输出−
Welcome to Scala version 2.9.0.1
Type in expressions to have them evaluated.
Type :help for more information.
将以下文本键入到Scala提示符的右侧,并按下回车键 −
scala> println("Hello, Scala!");
它将产生以下结果:
Hello, Scala!
脚本模式
使用以下说明在脚本模式下编写Scala程序。打开记事本并将以下代码添加到其中。
示例
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
}
}
保存文件为 − HelloWorld.scala.
打开命令提示窗口并进入保存程序文件的目录。使用“ scalac ”命令编译Scala程序,它将在当前目录生成一些类文件。其中一个将被命名为 HelloWorld.class 。这是一个将在Java虚拟机(JVM)上使用“ scala ”命令运行的字节码。
使用以下命令编译和执行您的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支持四种类型的标识符。
字母数字标识符
字母数字标识符以字母或下划线开头,后面可以跟随更多的字母、数字或下划线。在Scala中,$
字符是一个保留关键字,不应在标识符中使用。
以下是 合法的字母数字标识符 –
age, salary, _value, __1_value
以下是 非法标识符 –
$salary, 123abc, -salary
运算符标识符
运算符标识符由一个或多个运算符字符组成。 运算符字符是可打印的ASCII字符,例如+
, :
, ?
, ~
或#
。
以下是合法的运算符标识符 –
+ ++ ::: <?> :>
Scala编译器会在内部将操作符标识符进行”混合”处理,将它们转换为具有嵌入$
字符的合法Java标识符。例如,标识符:->
在内部表示为$colon$minus$greater
。
混合标识符
混合标识符由一个字母数字标识符组成,后面跟着下划线和一个操作符标识符。
以下是合法的混合标识符:
unary_+, myvar_=
在这里,unary_+
被用作方法名来定义一个一元+运算符,而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 允許對任意方法名 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)