当前位置: 首页 > 文档资料 > Scala 中文文档 >

Basic 语法

优质
小牛编辑
134浏览
2023-12-01

如果您对Java有很好的理解,那么学习Scala将非常容易。 Scala和Java之间最大的语法区别是';' 行结束字符是可选的。

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

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

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

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

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

  • Closure - closure是一个函数,其返回值取决于在此函数外声明的一个或多个变量的值。

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

第一个Scala计划

我们可以在两种模式下执行Scala程序:一种是interactive mode ,另一种是script mode

互动模式

打开命令提示符并使用以下命令打开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程序。 打开记事本并将以下代码添加到其中。

例子 (Example)

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

输出 (Output)

Hello, World!

基本语法

以下是Scala编程中的基本语法和编码约定。

  • Case Sensitivity - Scala区分大小写,这意味着标识符Hellohello在Scala中具有不同的含义。

  • Class Names - 对于所有类名,第一个字母应为大写。 如果使用多个单词来形成类的名称,则每个内部单词的第一个字母应为大写。

    Example - 类MyFirstScalaClass。

  • Method Names - 所有方法名称都应以小写字母开头。 如果使用多个单词来形成方法的名称,那么每个内部单词的第一个字母应该是大写字母。

    Example - def myMethodName()

  • Program File Name - Program File Name应与对象名称完全匹配。 保存文件时,应使用对象名称保存它(记住Scala区分大小写)并在名称末尾附加“ .scala ”。 (如果文件名和对象名不匹配,则程序将无法编译)。

    Example - 假设'HelloWorld'是对象名称。 然后该文件应保存为“HelloWorld.scala”。

  • def main(args: Array[String]) - Scala程序处理从main()方法开始,该方法是每个Scala程序的必需部分。

Scala标识符

所有Scala组件都需要名称。 用于对象,类,变量和方法的名称称为标识符。 关键字不能用作标识符,标识符区分大小写。 Scala支持四种类型的标识符。

字母数字标识符

字母数字标识符以字母或下划线开头,后面可以跟其他字母,数字或下划线。 '$'字符是Scala中的保留关键字,不应在标识符中使用。

以下是legal alphanumeric identifiers -

age, salary, _value,  __1_value

以下是illegal identifiers -

$salary, 123abc, -salary

运算符标识符

运算符标识符由一个或多个运算符字符组成。 运算符字符是可打印的ASCII字符,例如+,:,?,〜或#。

以下是合法运算符标识符 -

+ ++ ::: <?> :>

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

混合标识符

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

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

unary_+,  myvar_=

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

文字标识符

文字标识符是后面的标记(`...``)中包含的任意字符串。

以下是法律文字标识符 -

`x` `<clinit>` `yield`

Scala关键词

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

abstractcasecatchclass
defdoelseextends
falsefinalfinallyfor
forSomeifimplicitimport
lazymatchnewNull
objectoverridepackageprivate
protectedreturnsealedsuper
thisthrowtraitTry
truetypevalVar
whilewithyield
-:==>
<-<:<%>:
#@

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允许方法调用x.meth(args)用于任意方法名称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)