變數:
scala在定義乙個變數時,必須在其變數名前新增關鍵字「var」或「val」這兩者的區別是「var」修飾的變數可以新賦值,並把原值拋棄,而用了「val」修飾的變數,則被禁止重新賦值。前者在定義後只可以修改,而後者是只能讀不能寫的變數。
在定義變數時,scala推薦的變數名命名方式是「駝峰命名法」,每個單詞的首字母大寫,變數名和函式名以小寫字母開頭,類、物件和特質以大寫字母開頭。首次定義變數時就要給予具體的值來初始化。
在「var」型別重新賦值時,新值和舊值是同一型別,否則就會發生型別匹配錯誤
由於scala是函式式程式設計,函式式程式設計的思想之一就是傳入函式的引數不應該被改變,所以scala提倡建議val型變數。
函式:
scala的函式定義以「def」開頭,然後是乙個自定義的函式名(推薦駝峰命名法),接著是用圓括號「( )」包起來的引數列表。在引數列表裡,多個引數用逗號隔開,並且每個引數名後面要緊跟乙個冒號以及顯式宣告的引數型別,因為編譯器在編譯期間無法推斷出入參型別。寫完引數列表後,應該緊跟乙個冒號,再新增函式返回結果的型別。最後,再寫乙個等號「=」,等號後面是用花括號「」包起來的函式體。例如:用「def」開始函式定義
| 函式名
| | 引數及引數型別
| | | 函式返回結果的型別
| | | | 等號
def max(x: int, y: int): int =
通常,函式字面量會賦給乙個變數,這樣就能通過「變數名(引數)」的形式來使用函式字面量。在引數型別可以被推斷的情況下,可以省略型別,並且引數只有乙個時,圓括號也可以省略。
函式字面量的形式可以更精簡,即只保留函式體,並用下劃線「_」作為佔位符來代替引數。在引數型別不明確時,需要在下劃線後面顯式宣告其型別。多個佔位符代表多個引數,即第乙個佔位符是第乙個引數,第二個佔位符是第二個引數……因此不能重複使用某個引數。例如:
scala> val f = (_: int) + (_: int)
f: (int, int) => int = $$lambda$1072/1534177037@fb42c1c
scala> f(1, 2)
res0: int = 3
無論是用「def」定義的函式,還是函式字面量,它們的函式體都可以把乙個函式字面量作為乙個返回結果,這樣就成為了返回函式的函式;它們的引數變數的型別也可以是乙個函式,這樣呼叫時給的入參就可以是乙個函式字面量。型別為函式的變數,其冒號後面的型別寫法是「(引數1型別, 引數2型別,...) => 返回結果的型別」。例如:
scala> val add = (x: int) =>
add: int => (int => int) = $$lambda$1192/1767705308@55456711
scala> add(1)(10)
res0: int = 11
scala> def afunc(f: int => int) = f(1) + 1
afunc: (f: int => int)int
scala> afunc(x => x + 1)
res1: int = 3
在第乙個例子中,變數add被賦予了乙個返回函式的函式字面量。在呼叫時,第乙個括號裡的「1」是傳遞給引數x,第二個括號裡的「10」是傳遞給引數y。如果沒有第二個括號,得到的就不是11,而是「(y: int) => 1 + y」這個函式字面量。
在第二個例子中,函式afunc的引數f是乙個函式,並且該函式要求是乙個入參為int型別、返回結果也是int型別的函式。在呼叫時,給出了函式字面量「x => x + 1」。這裡沒有顯式宣告x的型別,因為可以通過f的型別來推斷出x必須是乙個int型別。在執行時,首先求值f(1),結合引數「1」和函式字面量,可以算出結果是2。那麼,「f(1) + 1」就等於3了。
---------------------
Scala語法(二) 控制結構
scala中的基本控制結構有順序 條件和迴圈三種方式,這個和其他的jvm語言是一致的,但是scala也有一些高階的流程控制結構類模式匹配。1 程式 package com.dtspark.scala.basic object controlstructures else 0println resul...
Scala型變 不變 協變及逆變
scala在高階型別的使用中,有三種變化,分別是順變 協變及逆變,下面詳細講講它們的含義與應用。高階型別是接受其他引數用來構造新型別的,所以又稱為 型別構造器 用type關鍵字來定義 定義高階型別 type foo t function0 t 宣告高階型別變數 val foo foo int 1 輸...
scala基礎語法
一 變數定義 1 val 定義的變數值不可以修改 2 var 定義的變數值可以修改 二 一些變數型別 1 unit 表示不返回任何結果方法的結果型別,相當於void 2 null null 空引用 3 nothing 任何其他類的子型別 4 any 所有其他類的父類 5 anyref 所有引用類的基...