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 区分大小写,这意味着标识符Hellohello在 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)