Scala - 基本语法

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

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

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

  • 等级 : 可以将类定义为描述与类相关的行为/状态的模板/蓝图.

  • 方法 :  ;方法基本上是一种行为.一个类可以包含许多方法.它是在写入逻辑,操纵数据和执行所有操作的方法中.

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

  • 关闭 :  闭包是一个函数,其返回值取决于在此函数外声明的一个或多个变量的值.

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

First Scala Program

我们可以在两种模式下执行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中具有不同的含义.

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

    示例 :  class 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字符,例如+,:,?,〜或#.

以下是合法的运算符标识符 :

&plus; &plus;&plus; ::: <?> :>

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

混合标识符

混合标识符由字母数字标识符组成,后跟一个字母数字标识符下划线和运营商标识符.

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

 
 unary_ + ,myvar_ =

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

文字标识符

文字标识符是随附的任意字符串back ticks(`...`).

以下是合法文字标识符 :

 
` x``< clinit>``yield`

Scala关键字

以下列表显示了保留字斯卡拉.这些保留字不能用作常量或变量或任何其他标识符名称.

abstractcasecatchclass
defdoelseextends
falsefinalfinallyfor
forSome如果隐式import
lazy匹配newNull
object覆盖packageprivate
protected返回密封超级
抛出特质尝试
t ruetypevalVar
whilewithyield&nbsp ;
-:==>
<  -<:<%>:
@

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

您可以从单个包中导入多个类或对象,例如,TreeMap和TreeSet来自scala.collection.immutable包 :

 
 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)