Basic 语法
如果您对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区分大小写,这意味着标识符Hello和hello在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中的保留字。 这些保留字不能用作常量或变量或任何其他标识符名称。
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中的评论
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)