📅  最后修改于: 2020-11-02 04:39:36             🧑  作者: Mango
如果您对Java有很好的了解,那么学习Scala将非常容易。 Scala和Java之间最大的语法差异是’;’行尾字符是可选的。
当我们考虑Scala程序时,可以将其定义为通过调用彼此的方法进行通信的对象的集合。现在让我们简要地研究一下类,对象,方法和实例变量的含义。
对象-对象具有状态和行为。对象是类的实例。示例-狗的状态-颜色,名称,品种和行为-摇摆,吠叫和进食。
类-可以将类定义为描述与该类相关的行为/状态的模板/蓝图。
方法-方法基本上是一种行为。一个类可以包含许多方法。在编写逻辑,处理数据和执行所有操作的方法中。
字段-每个对象都有其唯一的实例变量集,这些实例变量称为字段。对象的状态由分配给这些字段的值创建。
闭包–闭包是一个函数,其返回值取决于在此函数外部声明的一个或多个变量的值。
特性-特性封装了方法和字段定义,然后可以通过将它们混合到类中来重用它们。特性用于通过指定所支持方法的签名来定义对象类型。
我们可以以两种模式执行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是大小写敏感的,其手段标识您好,您好将在斯卡拉不同的含义。
班级名称-对于所有班级名称,首字母应为大写。如果使用多个单词构成类的名称,则每个内部单词的首字母应为大写。
示例-类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_=
在这里,一元加号;用作方法名称定义一元+运算符和用作方法名称的myvar_ =定义了一个赋值运算符(运算符重载)。
字面量标识符是用反引号(`。。。`)括起来的任意字符串。
以下是合法的字面量标识符-
`x` `` `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)