[Scala之旅]2-基礎 - TOUR OF SCALA

不言
發布: 2023-03-22 19:18:01
原創
1412 人瀏覽過

在這個頁面中,我們將介紹Scala的基礎知識。

在瀏覽器中嘗試Scala

你可以在瀏覽器中的ScalaFiddle執行Scala。

  1. 開啟https://scalafiddle.io

  2. #在左窗格中貼上println("Hello, world!")

  3. 點選「執行」按鈕。 輸出顯示在右窗格中。

這是一個簡單的,零設定的方式來測試Scala程式碼片段。

表達式

表達式是可計算的語句。

1 + 1
登入後複製

你可以使用 println 輸出表達式的結果。

println(1) // 1
println(1 + 1) // 2
println("Hello!") // Hello!
println("Hello," + " world!") // Hello, world!
登入後複製

你可以使用 val 關鍵字來命名表達式的結果。

val x = 1 + 1println(x) // 2
登入後複製

命名結果,例如這裡的 x,稱為值。引用一個值並不會重新計算它。

值不能被重新指派。

val x = 1 + 1x = 3 // This does not compile.
登入後複製

編譯器可以推斷出類型的值,但是您也可以明確地聲明類型,如下所述:

val x: Int = 1 + 1
登入後複製

注意,類型聲明Int 是在標識符x 之後出現的,並且還需要在兩者之間添加一個:

變數

變數就像值,但你可以重新分配它們。你可以使用 var 關鍵字定義一個變數。

var x = 1 + 1x = 3 // This compiles because "x" is declared with the "var" keyword.
println(x * x) // 9
登入後複製

與值一樣,你可以明確地宣告類型:

var x: Int = 1 + 1
登入後複製

程式碼區塊

你可以把周圍的表達式結合起來。我們稱這個為程式碼塊。

區塊的最後一個表達式的結果也是整個區塊的結果。

println({
  val x = 1 + 1
  x + 1
}) // 3
登入後複製

函數

函數是帶參數的表達式。

你可以定義一個匿名函數(也就是沒有名稱),它回傳一個給定的整數+1:

(x: Int) => x + 1
登入後複製

在推出符號=> 左邊是一個參數列表。右邊是一個包含參數的表達式。

你也可以命名函數。

val addOne = (x: Int) => x + 1
println(addOne(1)) // 2
登入後複製

函數可以使用多個參數。

val add = (x: Int, y: Int) => x + y
println(add(1, 2)) // 3
登入後複製

或它不需要參數。

val getTheAnswer = () => 42
println(getTheAnswer()) // 42
登入後複製

方法

方法看起來和函數非常相似,但是它們之間有一些關鍵的差異。

方法使用 def 關鍵字定義。 def 後面是方法名稱、參數清單、一個回傳類型和一個主體。

def add(x: Int, y: Int): Int = x + y
println(add(1, 2)) // 3
登入後複製

注意傳回類型是在參數清單和冒號 : Int 之後宣告的。

方法可以使用多個參數清單。

def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier
println(addThenMultiply(1, 2)(3)) // 9
登入後複製

或根本沒有參數列表。

def name: String = System.getProperty("name")
println("Hello, " + name + "!")
登入後複製

還有一些其他的區別,但現在,你可以把它們看作是類似函數的東西。

方法也可以有多行表達式。

def getSquareString(input: Double): String = {
  val square = input * input
  square.toString
}
登入後複製

body 的最後一個表達式是該方法的回傳值。 (Scala有一個回傳關鍵字return,但很少用到。)

類別

你可以使用類別關鍵字class 定義類,然後使用它的名稱和建構函數參數。

class Greeter(prefix: String, suffix: String) {
  def greet(name: String): Unit =
    println(prefix + name + suffix)
}
登入後複製

方法 greet 的回傳類型是 Unit,它表示回傳沒有任何意義。它類似於Java和c中的關鍵字void (不同之處在於,因為每個Scala表達式都必須有一定的值,所以實際上有一個類型Unit 的單例值,寫為()

val greeter = new Greeter("Hello, ", "!")
greeter.greet("Scala developer") // Hello, Scala developer!
登入後複製

之後我們將詳細介紹類別。 範例類別

Scala有一種特殊類型的類,稱為「範例」類別。預設情況下,範例類別是不可變的,並按值進行比較。

你可以用

case class

關鍵字定義範例類別。

case class Point(x: Int, y: Int)
登入後複製

您可以不需要使用 new 關鍵字來實例化範例類別。

val point = Point(1, 2)
val anotherPoint = Point(1, 2)
val yetAnotherPoint = Point(2, 2)
登入後複製

它們是按值進行比較的。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">if (point == anotherPoint) {   println(point + &quot; and &quot; + anotherPoint + &quot; are the same.&quot;) } else {   println(point + &quot; and &quot; + anotherPoint + &quot; are different.&quot;) } // Point(1,2) and Point(1,2) are the same. if (point == yetAnotherPoint) {   println(point + &quot; and &quot; + yetAnotherPoint + &quot; are the same.&quot;) } else {    println(point + &quot; and &quot; + yetAnotherPoint + &quot; are different.&quot;) } // Point(1,2) and Point(2,2) are different.</pre><div class="contentsignin">登入後複製</div></div>我們想要介紹的範例類別還有很多,我們相信你會愛上它們的!之後我們將詳細介紹它們。

物件

物件是它們自己定義的單一實例。你可以把他們想像成他們自己的類別的單例。

你可以透過使用關鍵字

object

來定義物件。

object IdFactory {  
  private var counter = 0 
  def create(): Int = { 
    counter += 1    
    counter
  }
}
登入後複製

你可以透過引用物件名稱來存取一個物件。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">val newId: Int = IdFactory.create() println(newId) // 1 val newerId: Int = IdFactory.create() println(newerId) // 2</pre><div class="contentsignin">登入後複製</div></div>稍後我們將詳細介紹物件。

特質

特徵是包含某些欄位和方法的型別。多個特徵可以組合在一起。

你可以透過使用關鍵字

trait

來定義特質。

trait Greeter { 
  def greet(name: String): Unit
}
登入後複製

特徵也可以有預設的實作。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">trait Greeter {   def greet(name: String): Unit =      println(&quot;Hello, &quot; + name + &quot;!&quot;) }</pre><div class="contentsignin">登入後複製</div></div>您可以使用

extends

關鍵字擴充特性,並使用

override

關鍵字覆寫實作。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">class DefaultGreeter extends Greeter class CustomizableGreeter(prefix: String, postfix: String) extends Greeter {    override def greet(name: String): Unit = {         println(prefix + name + postfix)   } } val greeter = new DefaultGreeter() greeter.greet(&quot;Scala developer&quot;) // Hello, Scala developer! val customGreeter = new CustomizableGreeter(&quot;How are you, &quot;, &quot;?&quot;) customGreeter.greet(&quot;Scala developer&quot;) // How are you, Scala developer?</pre><div class="contentsignin">登入後複製</div></div>在這裡,DefaultGreeter 只擴展了一個單一的特質,但是它可以擴展多個特質。

稍後我們將詳細介紹特質。 主方法

主方法是一個程式的入口點。 Java虛擬機需要一個命名為

main

的主方法,並接受一個參數,一個字串陣列。

使用對象,您可以定義一個主方法,如下:<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">object Main {     def main(args: Array[String]): Unit =      println(&quot;Hello, Scala developer!&quot;) }</pre><div class="contentsignin">登入後複製</div></div> <p>                                                </p> <p class="article fmt article__content"><br></p> <p><br></p> <p class="comments-box-content"></p>

以上是[Scala之旅]2-基礎 - TOUR OF SCALA的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!