Scala - 基本语法


如果你对Java有很好的了解,那么学习Scala就会很容易。Scala 和 Java 之间最大的语法差异是“;” 行结束符是可选的。

当我们考虑 Scala 程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。现在让我们简单地了解一下类、对象、方法和实例变量的含义。

  • 对象- 对象具有状态和Behave。对象是类的实例。示例 - 狗有状态 - 颜色、名称、品种以及Behave - 摇摆、吠叫和进食。

  • 类- 类可以定义为描述与类相关的Behave/状态的模板/蓝图。

  • 方法- 方法基本上是一种Behave。一个类可以包含许多方法。在方法中编写逻辑、操作数据并执行所有操作。

  • 字段- 每个对象都有其唯一的一组实例变量,称为字段。对象的状态是由分配给这些字段的值创建的。

  • 闭包-闭包是一个函数,其返回值取决于该函数外部声明的一个或多个变量的值。

  • Traits - 特征封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。特征用于通过指定受支持方法的签名来定义对象类型。

第一个 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 字符,例如 +、:、?、~ 或 #。

以下是合法的运营商标识符 -

+ ++ ::: <?> :>

Scala 编译器将在内部“破坏”运算符标识符,将其转换为嵌入 $ 字符的合法 Java 标识符。例如,标识符 :-> 在内部将表示为 $colon$minus$greater。

混合标识符

混合标识符由字母数字标识符组成,后跟下划线和运算符标识符。

以下是合法的混合标识符 -

unary_+,  myvar_=

这里,用作方法名称的 unary_+ 定义一元 + 运算符,用作方法名称的 myvar_= 定义赋值运算符(运算符重载)。

文字标识符

文字标识符是用反引号 (` . . . `) 括起来的任意字符串。

以下是合法的文字标识符 -

`x` `<clinit>` `yield`

Scala 关键字

以下列表显示了 Scala 中的保留字。这些保留字不得用作常量、变量或任何其他标识符名称。

抽象的 案件 抓住 班级
定义 做 别的 延伸
错误的 最终的 最后 为了
对于一些 如果 隐含的 进口
懒惰的 匹配 新的 无效的
目的 覆盖 包裹 私人的
受保护的 返回 密封 极好的
这 扔 特征 尝试
真的 类型 瓦尔 瓦尔
尽管 和 屈服  
- : = =>
<- <: <% >:
# @

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)

斯卡拉包

包是命名的代码模块。例如,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)