Scala入門系列(二) Scala函式基礎介紹

2021-10-08 03:31:44 字數 2285 閱讀 1767

2、匿名函式

3、高階函式

4、函式巢狀

5、柯里化

6、隱式引數

7、命名引數

8、引數預設值

函式是scala的核心

def 函式名([引數列表]):[返回值]=

列1:def square(x: int): int =

列2:def sayhello(x:string):unit=

函式呼叫

square(10)

sayhello("scala")

傳值呼叫時,引數只在呼叫時計算一次,後續重複使用計算的結果

def square(x: int): int =

square(1+2) //先計算1+2

傳名呼叫時,引數在呼叫時不會計算,只有真正用到引數時才計算

def square(x: => int): int =

square(1+2) //呼叫時不計算

指不含函式名稱的函式

匿名函式定義

「=>」左邊為引數列表,右邊為函式體

(引數列表)=>

如果函式體包括多條語句,應使用「{}」包含

(x:int)=>x*x

(x:int)=>

() =>

val f1=(x:int)=>

f1(2)

高階函式可以將其他函式作為引數或者使用函式作為輸出結果

//函式作為引數

def dosquare(f:int=>int,p:int)=f(p)

def square(x:int):int=x*x

dosquare(square,square(2))

//函式作為返回值

//返回型別為函式(int=>int)

def dosquare()=

dosquare()(2)

scala函式內可以定義函式,函式內的函式也稱區域性函式或者內嵌函式

//使用函式巢狀實現階乘運算

def factorial(i: int): int =

fact(i, 1) //不能在factorial()之外呼叫

}

方法可以定義多個引數列表,當使用較少的引數列表呼叫多引數列表的方法時,會產生乙個新的函式,該函式接收剩餘的引數列表作為其引數。這被稱為柯里化

柯里化指將原來接受兩個引數的函式變成新的接受乙個引數的函式的過程

def modn(n: int,x: int) = ((x % n) == 0)

//柯里化

def modn(n: int)(x: int) = ((x % n) == 0)

def f1(n: int, x: int) = modn(n)(x)

//新函式接收剩餘的引數列表作為其引數

def f2(x: int) = modn(10)(x)

def f3(n: int) = modn(n)(10)

def f4 = modn(10)(_)

方法可以具有隱式引數列表,由引數列表開頭的implicit 關鍵字標記

scala可自動傳遞正確型別的隱式值

def sum(x:int)(implicit y:int)=x+y

implicit var a=10 //將作為int型別隱式值自動傳遞

sum(10) //20

通常情況下,傳入引數與函式定義的引數列表一一對應

命名引數允許使用任意順序傳入引數

def printname(first:string, last:string) = 

//prints "john smith"

printname("john","smith")

printname(first = "john",last = "smith")

printname(last = "smith",first = "john")

scala函式允許指定引數的預設值,從而允許在呼叫函式時不指明該引數

def printname(first:string="john", last:string="smith") = 

//prints "john smith"

printname()

scala學習系列二

一 scala語言開發注意事項 1 scala程式的執行入口是main 函式 2 scala語言嚴格區分大小寫。3 scala方法由一條條語句構成,每個語句後不需要分號 scala語言會在每行後自動加分號 這也體現出scala的簡潔性。4 如果在同一行有多條語句,除了最後一條語句不需要分號,其它語句...

Scala入門筆記二

目錄使用反引號定義識別符號 無引數方法 優先順序規則 if語句 迴圈生成器表示式 保護式 篩選元素 新增多個保護式 yielding 擴充套件作用域與值定義 while迴圈 do.while迴圈 條件操作符 使用try.catch.final子句 惰性賦值 列舉可插入字串 不能使用保留字.val x...

Scala 語法入門

for i 1 to 3 j 1 to 3 println i j for i 1 to 3 j 1 to 3 if i j print f 3d 引數後面跟型別 def sum a int,b int int var sumfun a int,b int a b 預設值 def sum a int...