Scala 基本语法

  • 基本语法

    如果您对Java有很好的了解,那么学习Scala将会非常容易。Scala和Java之间最大的语法差异是行结束符';'是可选的。
    当我们考虑Scala程序时,可以将其定义为通过调用彼此的方法进行通信的对象的集合。现在让我们简要地研究一下类,对象,方法和实例变量的含义。
    • 对象 -对象具有状态和行为。对象是类的实例。示例-狗的状态-颜色,名称,品种和行为-摇摆,吠叫和进食。
    • -可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
    • 方法 -方法基本上是一种行为。一个类可以包含许多方法。在编写逻辑,处理数据和执行所有操作的方法中。
    • 字段 -每个对象都有其唯一的实例变量集,这些实例变量称为字段。对象的状态由分配给这些字段的值创建。
    • 闭包 - 闭包是一个函数,其返回值取决于此函数外部声明的一个或多个变量的值。
    • 特性 -特性封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。特性用于通过指定所支持方法的签名来定义对象类型。
  • 第一个Scala程序

    我们可以以两种模式执行Scala程序:一种是交互模式,另一种是脚本模式
    互动模式
    打开命令提示符,然后使用以下命令打开Scala。
    
    \>scala
    
    如果您的系统中安装了Scala,将显示以下输出-
    
    Welcome to Scala 2.13.2 (OpenJDK 64-Bit Server VM, Java 1.8.0_242).
    Type in expressions for evaluation. Or try :help.
    
    scala> 
    
    在Scala提示符右侧键入以下文本,然后按Enter键-
    
    scala> println("Hello, jc2182!");
    
    它将产生以下结果-
    
    scala> println("Hello, jc2182!");
    
    脚本模式
    使用以下说明以脚本模式编写Scala程序。打开记事本,并在其中添加以下代码。
    
    object HelloWorld {
       /* This is my first java program.  
       * This will print 'Hello World' as the output
       */
       def main(args: Array[String]): Unit =  {
          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中表示不同的含义。
    • 类名称 -对于所有类名称,首字母应为大写。如果使用多个单词构成类的名称,则每个内部单词的首字母应为大写。示例 - class MyFirstScalaClass。
    • 方法名称 - 所有方法名称均应以小写字母开头。如果使用多个单词构成方法的名称,则每个内部单词的首字母应为大写。 示例 - def myMethodName()
    • 程序文件名 - 程序文件名应与对象名完全匹配。保存文件时,应使用对象名称(记住Scala区分大小写)进行保存,并在名称末尾附加'.scala'。(如果文件名和对象名不匹配,则您的程序将无法编译)。示例 -假设“HelloWorld”是对象名称。然后,该文件应另存为“HelloWorld.scala”。
    • def main(args:Array [String]) - Scala程序的处理从main()方法开始,该方法是每个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中的保留字。这些保留字不能用作常量或变量或任何其他标识符名称。
    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支持与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)以及对任意字段名称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)