Scala之基础语法

如果您熟悉Java语言语法和编程,那么学习Scala将会很容易。Scala和Java之间最大的句法差异在于行结束字符的分号(;) 是可选的。

一、执行Scala程序

  • 交互模式
  • 脚本模式

1、交互模式

打开命令提示符进入到目录:D:\software\scala-2.12.3\bin 执行如下命令运行程序 -

D:\software\scala-2.12.3\bin> scala
Welcome to Scala 2.12.3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).
Type in expressions for evaluation. Or try :help.

scala> println("Hello, Scala!");
Hello, Scala!

scala>

2. 脚本模式

打开记事本创建一个源文件:HelloWorld.scala,保存在目录:D:\software\scala-2.12.3\bin 下,并在其中编写以下代码

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 } }

打开命令提示符窗口并转到保存程序文件的目录。

使用'scalac'命令编译Scala程序,它将在当前目录中生成一些类文件。其中一个将被编译生成为HelloWorld.class。 这是一个使用'scala'命令在Java虚拟机(JVM)上运行的字节码。

D:\software\scala-2.12.3\bin>scalac HelloWorld.scala

D:\software\scala-2.12.3\bin>scala HelloWorld
Hello, world!

D:\software\scala-2.12.3\bin>

二、语法

1、基础语法

当编写Scala程序时,它可以被定义为通过调用彼此的方法进行通信的对象的集合。

现在我们简单地看一下类,对象,方法和实例变量的含义:

  • 对象 - 对象有状态和行为。一个对象是类的一个实例。例如 - 狗有状态:颜色,名称,品种,它行为有:摇摆,吠叫和吃东西。
  • 类 - 可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
  • 方法 - 一个方法基本上是一种行为。一个类可以包含很多方法。将逻辑代码写入的方法中,数据在方法中操纵并且执行所有的动作。
  • 字段 - 每个对象都有其唯一的一组实例变量,称为字段。对象的状态是由分配给这些字段的值来创建的。
  • 闭包 - 闭包是一个函数,其返回值取决于在此函数之外声明的一个或多个变量的值。
  • 特征 - 特征(Traits)封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们,特征(Traits)用于通过指定支持的方法的签名来定义对象类型。

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

  • 区分大小写 - Scala是区分大小写的,比如标识符Hellohello在Scala中表示不同的含义(对象)。
  • 类名称 - 对于所有类名,第一个字母应为大写。如果使用多个单词来形成类的名称,则每个内部单词的第一个字母应该是大写。示例 - class MyFirstScalaClassclass Employee*类等。
  • 方法名称 - 所有方法名称应以小写字母开头。如果使用多个单词形成方法的名称,则每个内部单词的第一个字母应为大写。示例 - def myMethodName()def getName()等。
  • 程序文件名 - 程序文件的名称应与对象名称完全匹配。保存文件时,您应该使用对象名称保存它(记住Scala是区分大小写的),并将.scala附加到文件名称的末尾。 (如果文件名和对象名不匹配,则程序将不会编译)。示例 - 假设HelloWorld是对象名称。那么文件应该保存为HelloWorld.scala
  • def main(args:Array [String]) - Scala程序从main()方法开始,这是每个Scala程序的强制性部分。

2、Scala标识符

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

字母数字标识符

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

以下是合法的字母数字标识符 -

age, salary, _value,  __1_value

以下是非法标识符 -

$salary, 123abc, -salary

运算符标识符

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

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

+ ++ ::: <?> :>

Scala编译器将在内部将操作符标识符转换成具有嵌入式$字符的合法Java标识符。例如,标识符:->将被内部表示为$colon$minus$greater

混合标识符

混合标识符由字母数字标识符组成,后面跟着一个下划线和一个操作符标识符。

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

unary_+,  myvar_=

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

字面识别符

一个文字标识符是一个随意的字符串,包含在后面的勾号(...)中。

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

`x` `<clinit>` `yield`

3、Scala关键字

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

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

4、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!") } }

5、换行字符

Scala是一种面向行的语言,其语句可能以分号(;)或换行符终止。语句结尾处的分号(;)通常是可选的。如果需要,您可以输入一个分号(;),但如果语句在单行上自行显示,则不需要输入。 另一方面,如果在单行上写多个语句,则需要分号。 下面的语法是多个语句的用法。

val s = "hello"; println(s)

6、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包的TreeMapTreeSet -

import scala.collection.immutable.{TreeMap, TreeSet}

重命名成员

import java.util.{HashMap => JavaHashMap}

隐藏成员

import java.util.{HashMap => _, _} // 引入了util包的所有成员,但是HashMap被隐藏了

注意:默认情况下,Scala 总会引入 java.lang._ 、 scala._ 和 Predef._,这里也能解释,为什么以scala开头的包,在使用时都是省去scala.的。

7、应用动态

一个能够进行动态调用的标记特征。此特征的实例x允许方法调用x.meth(args)用于任意方法名称和参数列表args以及对任意字段名称字段的字段访问x.field。此功能在Scala-2.10中引入。

如果调用不是由本机支持的(即,如果类型检查失败),则根据以下规则重写:

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)

 

转载于:https://www.cnblogs.com/dangjf/p/10331176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值