Scala - 基本语法
如果你对 Java 有很好的了解,那么你学习 Scala 将非常容易。 Scala 和 Java 之间最大的语法差异是 ';' 行结束符是可选的。
当我们考虑一个 Scala 程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。 现在让我们简要了解一下类、对象、方法和实例变量的含义。
对象 − 对象具有状态和行为。 对象是类的一个实例。 示例 减号 狗有状态——颜色、名字、品种以及行为——摇摆、吠叫和进食。
类 − 类可以定义为描述与类相关的行为/状态的模板/蓝图。
方法 − 方法基本上是一种行为。 一个类可以包含许多方法。 它是在编写逻辑、操作数据和执行所有操作的方法中。
字段 − 每个对象都有其唯一的一组实例变量,称为字段。 对象的状态由分配给这些字段的值创建。
closure − closure 是一个函数,它的返回值取决于在该函数之外声明的一个或多个变量的值。
特征 − 特征封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。 特征用于通过指定支持的方法的签名来定义对象类型。
第一个 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。 这是一个字节码,它将使用"scala"命令在 Java 虚拟机 (JVM) 上运行。
使用以下命令编译和执行您的 Scala 程序。
\> scalac HelloWorld.scala \> scala HelloWorld
输出
Hello, World!
基本语法
以下是 Scala 编程中的基本语法和编码约定。
区分大小写 − Scala 区分大小写,这意味着标识符 Hello 和 hello 在 Scala 中具有不同的含义。
类名 − 对于所有类名,第一个字母应为大写。 如果使用多个单词组成类名,则每个内部单词的首字母应大写。
示例 − 类 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 字符,例如 +、:、?、~ 或 #。
Following are legal operator identifiers −
+ ++ ::: <?> :>
Scala 编译器将在内部"修改"运算符标识符,以将它们转换为嵌入了 $ 字符的合法 Java 标识符。 例如,标识符 :-> 将在内部表示为 $colon$minus$greater。
混合标识符
混合标识符由一个字母数字标识符组成,后跟一个下划线和一个运算符标识符。
以下是合法的混合标识符 −
unary_+, myvar_=
这里,用作方法名的 unary_+ 定义了一元 + 运算符,用作方法名的myvar_= 定义了一个赋值运算符(运算符重载)。
Literal Identifiers
文字标识符是包含在反引号(` . . . `)中的任意字符串。
以下是合法的文字标识符 −
`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) 以及对任意字段名称字段的字段访问 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)