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的所有功能都可用:您可以定義函數,類,方法等。