- Scala 教程
- Scala - 首页
- Scala - 概述
- Scala - 特性
- Scala - 环境搭建
- Scala - 构建工具 (SBT)
- Scala - 基本语法
- 数据类型和变量
- Scala - 数据类型
- Scala - 变量
- Scala - 字符串
- Scala - 数组
- Scala 运算符
- Scala - 运算符
- Scala - 算术运算符
- Scala - 关系运算符
- Scala - 逻辑运算符
- Scala - 位运算符
- Scala - 赋值运算符
- Scala 条件语句
- Scala - if else
- Scala 循环语句
- Scala - 循环语句
- Scala - while 循环
- Scala - do-while 循环
- Scala - for 循环
- Scala - break 语句
- Scala 类和对象
- Scala - 类和对象
- Scala - 访问修饰符
- Scala 方法和函数
- Scala - 函数
- Scala - 按名称调用函数
- Scala - 带命名参数的函数
- Scala - 带变长参数的函数
- Scala - 递归函数
- Scala - 默认参数值
- Scala - 高阶函数
- Scala - 嵌套函数
- Scala - 匿名函数
- 部分应用函数
- Scala - 柯里化函数
- Scala 集合
- Scala - 集合
- Scala - 列表
- Scala - 集合
- Scala - 映射
- Scala - 元组
- Scala - 迭代器
- Scala - Option
- Scala 模式匹配
- Scala - 模式匹配
- Scala - 异常处理
- Scala - 提取器
- Scala - 正则表达式
- Scala 文件 I/O
- Scala - 文件 I/O
- Scala 高级概念
- Scala - 闭包
- Scala - 特质
- Scala 有用资源
- Scala - 快速指南
- Scala - 在线编译器
- Scala - 有用资源
- Scala - 讨论
Scala - 基本语法
如果你对Java有很好的理解,那么学习Scala会非常容易。Scala和Java之间最大的语法区别在于,Scala的语句结尾分号';'是可选的。
当我们考虑一个Scala程序时,它可以定义为一个通过调用彼此方法进行通信的对象集合。让我们简要了解一下类、对象、方法和实例变量的含义。
对象 - 对象具有状态和行为。对象是类的实例。例如 - 狗具有状态 - 颜色、名字、品种以及行为 - 摇尾巴、吠叫和吃东西。
类 - 类可以定义为描述与类相关的行为/状态的模板/蓝图。
方法 - 方法基本上是一种行为。一个类可以包含许多方法。在方法中编写逻辑,操作数据并执行所有操作。
字段 - 每个对象都有自己唯一的一组实例变量,这些变量称为字段。对象的 state 是通过分配给这些字段的值创建的。
闭包 - 闭包是一个函数,其返回值取决于在此函数外部声明的一个或多个变量的值。
特质 - 特质封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。特质用于通过指定支持方法的签名来定义对象类型。
第一个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提示符的右侧键入以下文本,然后按Enter键:
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)