1. 程式人生 > >Scala 程式設計基礎

Scala 程式設計基礎

1 表示式


表示式是可計算的語句。

1 + 1
"ss" + "gg"

常量

使用val為表示式的結果命名。

val x = 1 + 1

引用常量不需要重計算表示式。
常量不能被重賦值。
常量型別可以被推匯出,也可以顯式指定型別。

# 顯式指定常量型別
val x:Int = 1 +  1

變數

變數與常量相似,只不過變數可以被重賦值。
使用var定義變數。
var與val一樣,也可以顯式指定型別。

var t:Int = 1 + 2
t = 12
println(t)

2 塊


可以使用塊將表示式結合。
塊中最後一個表示式的結果也是整個塊的結果。

println({
    var x = 1 + 4
    x + 666
})

3 函式


函式是帶引數的表示式。
可以使用匿名函式,也可以為函式命名。
函式可以有多個引數,可以沒有引數。

# 匿名函式
(x: Int) => x + 1

# 命名函式
var ff = (x:Int, y:Int)=>x + y
println(ff(12, 24))

# 無參函式
val cc = ()=> 1
println(cc())

4 方法


方法使用def關鍵字定義,def之後是方法名、引數列表、返回值型別與方法體。
方法可以有單個引數列表,也可以有多個引數列表,也可以沒有引數列表。
方法可以有也可以有多行表示式。最後一行是方法的返回值,雖然Scala也有return關鍵字,但是很少使用。

# 方法定義
def add(x: Int, y: Int): Int = x + y

# 方法定義(多個引數列表)
def mu(x: Int, y: Int)(multiplier:Int): Int = (x+y)*multiplier
println(mu(1,2)(3))

# 方法定義(沒有引數列表)
def name:String = System.getProperty("user.name")
println(name)

# 方法定義(多行表示式)
def getS(input: Double): String = {
    val s = input * input
    s.toString
}

5 類


使用class關鍵字定義類,class之後是類名與構造器引數。

# 定義類
class Greeter(pre:String, suf: String) {
    def greet(name:String): Unit = {
        println(pre + name + suf)
    }
}

方法返回型別Unit類似於Java與C中的void。
每個Scala表示式必須包含值,Unit型別存在一個單例值,written()。此值不攜帶任何資訊。

可以使用new關鍵字建立類例項

# 建立類例項
val getter = new Greeter("Hello, ","!" )
getter.greet("Scala developer")

6 樣例類


Scala具有一個特殊型別的類稱之為"樣例"類。預設情況下,樣例類是不可改變的並且通過值進行比較。可以使用case class關鍵字定義樣例類。

# 定義樣例類
case class Point(x: Int, y:Int)

# 例項化樣例類(不需要new關鍵字)
val po = Point(1, 2)
val an = Point(1, 2)
var ye = Point(2, 2)

# 樣例類通過值進行比較
println(po == an)
println(ye == an)

7 物件


物件是自身定義的單個例項,可以看作是自身類的單例。
可以使用object關鍵字定義物件。
可以使用物件的名稱訪問物件。

# 物件定義
object IdFactory {
    private var counter = 0
    def create(): Int = {
        counter += 1
        counter
    }
}

# 訪問物件
val newId:Int = IdFactory.create()
println(newId)

8 特質


特質是包含某些欄位與方法的型別。多個特質可以組合在一起。
使用trait關鍵字定義特質。
對類使用extend關鍵字,可以擴充套件特質,並且使用override關鍵字可以重寫特質中的方法實現。
類可以擴充套件多個特質。

# 定義特質
trait Gre {
    def greet(name: String):Unit
}

# 定義特質(方法具有預設實現)
trait Gre {
    def greet(name: String):Unit =
        println("Hello, " + name + "!")
}

# 擴充套件特質
class De extends Gre

# 擴充套件特質(重寫方法)
class Cus (pre:String, post: String) extends Gre{
    override def greet(name: String): Unit = {
        println(pre + name + post)
    }
}

9 主方法


主方法是程式的進入點。JVM要求主方法被命名為main,並且具有一個字串陣列引數。

object Main {
    def main(args: Array[String]):Unit =
        println("Hello, Scala Developer!")
}

翻譯源:Scale Tour