變量:
Scala在定義一個變量時,必須在其變量名前添加關鍵字“var”或“val”這兩者的區別是“var”修飾的變量可以新賦值,并把原值拋棄,而用了“val”修飾的變量,則被禁止重新賦值。前者在定義后只可以修改,而后者是只能讀不能寫的變量。
在定義變量時,Scala推薦的變量名命名方式是“駝峰命名法”,每個單詞的首字母大寫,變量名和函數名以小寫字母開頭,類、對象和特質以大寫字母開頭。首次定義變量時就要給予具體的值來初始化。
在“var”類型重新賦值時,新值和舊值是同一類型,否則就會發生類型匹配錯誤
由于Scala是函數式編程,函數式編程的思想之一就是傳入函數的參數不應該被改變,所以Scala提倡建議val型變量。
函數:
Scala的函數定義以“def”開頭,然后是一個自定義的函數名(推薦駝峰命名法),接著是用圓括號“( )”包起來的參數列表。在參數列表里,多個參數用逗號隔開,并且每個參數名后面要緊跟一個冒號以及顯式聲明的參數類型,因為編譯器在編譯期間無法推斷出入參類型。寫完參數列表后,應該緊跟一個冒號,再添加函數返回結果的類型。最后,再寫一個等號“=”,等號后面是用花括號“{ }”包起來的函數體。例如:
用“def”開始函數定義
| 函數名
||參數及參數類型
|||函數返回結果的類型
||||等號
|||||
def max(x: Int, y: Int): Int = {
if(x > y)
x
else|
y|
}|
|
花括號里定義函數體
---------------------
版權聲明:本文為CSDN博主「_iChthyosaur」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34291505/article/details/86750352
在Scala的代碼里,句末的分號是可選的,但是如果一行有多條語句,則必須用分號隔開;如果一行只有一條完整語句,那么這個分號可以寫也可以不寫。函數的“return”關鍵字也是可選的,建議不要顯式聲明“return”。返回結果有一個特殊的類型“Unit”表示沒有返回值,該函數沒有任何可引用的返回結果。Unit類型同樣可以被推斷出來,但如果顯式聲明為Unit類型的函數,則即使函數體最后有一個可以返回具體值的表達式,也不會把表達式的結果返回。
如果將函數定義在class、object、trait里面的函數,這種函數叫做“成員函數”或者“方法”
四、函數字面量
函數式編程有兩個主要思想,其中之一就是:函數是一等(first-class)的值。換句話說,一個函數的地位與一個Int值、一個String值等等,是一樣的。既然一個Int值可以成為函數的參數、函數的返回值、定義在函數體里、存儲在變量里,那么,作為地位相同的函數,也可以這樣。你可以把一個函數當參數傳遞給另一個函數,也可以讓一個函數返回一個函數,亦可以把函數賦給一個變量,又或者像定義一個值那樣在函數里定義別的函數(即前述的嵌套函數)。就像寫一個整數字面量“1”那樣,Scala也可以定義函數的字面量。函數字面量是一種匿名函數的形式,它可以存儲在變量里、成為函數參數或者當作函數返回值,其定義形式為:
(參數1: 參數1類型, 參數2: 參數2類型, ...) => { 函數體 }
通常,函數字面量會賦給一個變量,這樣就能通過“變量名(參數)”的形式來使用函數字面量。在參數類型可以被推斷的情況下,可以省略類型,并且參數只有一個時,圓括號也可以省略。
函數字面量的形式可以更精簡,即只保留函數體,并用下劃線“_”作為占位符來代替參數。在參數類型不明確時,需要在下劃線后面顯式聲明其類型。多個占位符代表多個參數,即第一個占位符是第一個參數,第二個占位符是第二個參數……因此不能重復使用某個參數。例如:
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) => { (y: Int) => x + y }
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
+關注
關注
0文章
42瀏覽量
6454 -
Chisel
+關注
關注
0文章
7瀏覽量
466
發布評論請先 登錄
相關推薦
SUMIF函數對比VLOOKUP的優勢
SUMIF函數與SUMIFS函數的區別
SUMIF函數使用教程
條理清晰,淺顯易懂:Lua語法基礎知識(第二部分)
Lua語法基礎教程(中篇)
![Lua<b class='flag-5'>語法</b>基礎教程(中篇)](https://file1.elecfans.com//web2/M00/0A/44/wKgZomccZIWAUZsxAAAimiNr02k015.png)
面試常考+1:函數指針與指針函數、數組指針與指針數組
![面試常考+1:<b class='flag-5'>函數</b>指針與指針<b class='flag-5'>函數</b>、數組指針與指針數組](https://file.elecfans.com/web2/M00/20/B3/pYYBAGGfNNmAK-PZAAJsGM5Cgk0227.jpg)
評論