Scala LanguageScala语言入门


备注

Scala是一种现代的多范式编程语言,旨在以简洁,优雅和类型安全的方式表达常见的编程模式。它平滑地集成了面向对象功能语言的功能

大多数给出的示例都需要安装Scala。 这是Scala安装页面 ,这是“如何设置Scala”示例。 scalafiddle.net是在Web上执行小代码示例的好资源。

版本

发布日期
2.10.1 2013年3月13日
2.10.2 2013年6月6日
2.10.3 2013年10月1日
2.10.4 2014年3月24日
2.10.5 2015年3月5日
2.10.6 2015年9月18日
2.11.0 2014年4月21日
2.11.1 2014年5月21日
2.11.2 2014年7月24日
2.11.4 2014-10-30
2.11.5 2014年1月14日
2.11.6 2015年3月5日
2.11.7 2015年6月23日
2.11.8 2016年3月8日
2.11.11 2017年4月19日
2.12.0 2016年11月3日
2.12.1 2016年12月6日
2.12.2 2017年4月19日

Hello World作为脚本

Scala可以用作脚本语言。要演示,请使用以下内容创建HelloWorld.scala

println("Hello")
 

使用命令行解释器执行它( $ 是命令行提示符):

$ scala HelloWorld.scala
Hello
 

如果省略.scala (例如,如果您只是键入scala HelloWorld ),则运行器将查找带有字节码而不是编译的编译.class 文件,然后执行脚本。

注意:如果使用scala作为脚本语言,则不能定义包。

在使用bash 或类似shell终端的操作系统中,可以使用'shell preamble'来执行Scala脚本。创建一个名为HelloWorld.sh 的文件,并将以下内容作为其内容:

#!/bin/sh
exec scala "$0" "$@"
!#
println("Hello")
 

#! 之间的部分#!!# 是'shell preamble',被解释为bash脚本。其余的是斯卡拉。

保存上述文件后,必须授予其“可执行”权限。在shell中你可以这样做:

$ chmod a+x HelloWorld.sh
 

(请注意,这为每个人提供了权限: 阅读chmod以了解如何为更具体的用户集设置它。)

现在您可以像这样执行脚本:

$ ./HelloWorld.sh
 

通过定义'主'方法获得Hello World

将此代码放在名为HelloWorld.scala 的文件中:

object Hello {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
  }
}
 

现场演示

要将其编译为可由JVM执行的字节码:

$ scalac HelloWorld.scala
 

要运行它:

$ scala Hello
 

当Scala运行时加载程序时,它会使用main 方法查找名为Hello 的对象。 main 方法是程序入口点并执行。

请注意,与Java不同,Scala不需要在它们所在的文件之后命名对象或类。相反,在命令scala Hello 传递的参数Helloscala Hello 查找的对象,其中包含要执行的main 方法。完全可能在同一.scala 文件中有多个带有main方法的对象。

args 数组将包含给予程序的命令行参数(如果有)。例如,我们可以像这样修改程序:

object HelloWorld {
  def main(args: Array[String]): Unit = {
    println("Hello World!")
    for {
      arg <- args
    } println(s"Arg=$arg")
  }
}
 

编译它:

$ scalac HelloWorld.scala
 

然后执行它:

$ scala HelloWorld 1 2 3
Hello World!
Arg=1
Arg=2
Arg=3
 

Hello World通过扩展App

object HelloWorld extends App {
  println("Hello, world!")
}
 

现场演示

通过扩展App 特征 ,您可以避免定义显式main 方法。 HelloWorld 对象的整个主体被视为“主要方法”。

2.11.0

延迟初始化

根据官方文档App 使用称为延迟初始化的功能。这意味着在调用main方法之后初始化对象字段。

2.11.0

延迟初始化

根据官方文档App 使用称为延迟初始化的功能。这意味着在调用main方法之后初始化对象字段。

DelayedInit 现已弃用以供一般使用,但作为特殊情况仍然支持 App 。支持将持续到确定并实施替换功能为止。

要在扩展App 时访问命令行参数,请使用this.args

object HelloWorld extends App {
  println("Hello World!")
  for {
    arg <- this.args
  } println(s"Arg=$arg")
}
 

使用App ,对象的主体将作为main 方法执行,不需要覆盖main

Scala Quicksheet

描述
分配不可变的int值 val x = 3
分配可变的int值 var x = 3
使用显式类型分配不可变值 val x: Int = 27
分配延迟评估的值 lazy val y = print("Sleeping in.")
将函数绑定到名称 val f = (x: Int) => x * x
将函数绑定到具有显式类型的名称 val f: Int => Int = (x: Int) => x * x
定义方法 def f(x: Int) = x * x
使用显式类型定义方法 def f(x: Int): Int = x * x
定义一个类 class Hopper(someParam: Int) { ... }
定义一个对象 object Hopper(someParam: Int) { ... }
定义一个特征 trait Grace { ... }
获取序列的第一个元素 Seq(1,2,3).head
如果切换 val result = if(x > 0) "Positive!"
获取序列的所有元素,除了第一个 Seq(1,2,3).tail
循环列表 for { x <- Seq(1,2,3) } print(x)
嵌套循环 for {
x <- Seq(1,2,3)
y <- Seq(4,5,6)
} print(x + ":" + y)
对于每个列表元素执行函数 List(1,2,3).foreach { println }
打印到标准输出 print("Ada Lovelace")
按字母数字排序列表 List('b','c','a').sorted

使用Scala REPL

当您在没有附加参数的终端中执行scala ,它会打开一个REPL (Read-Eval-Print Loop)解释器:

nford:~ $ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_66).
Type in expressions for evaluation. Or try :help.

scala> 
 

REPL允许您以工作表方式执行Scala:保留执行上下文,您可以手动尝试命令而无需构建整个程序。例如,输入val poem = "As halcyons we shall be" 将如下所示:

scala> val poem = "As halcyons we shall be"
poem: String = As halcyons we shall be
 

现在我们可以打印我们的val

scala> print(poem)
As halcyons we shall be
 

请注意, val 是不可变的,不能被覆盖:

scala> poem = "Brooding on the open sea"
<console>:12: error: reassignment to val
       poem = "Brooding on the open sea"
 

但是在REPL中你可以重新定义一个val (如果在同一范围内完成,那么会导致正常的Scala程序出错):

scala> val poem = "Brooding on the open sea"
poem: String = Brooding on the open sea
 

对于REPL会话的剩余部分,这个新定义的变量将影响先前定义的变量。 REPL对于快速查看对象或其他代码的工作方式非常有用。 Scala的所有功能都可用:您可以定义函数,类,方法等。