Scala七 Scala核心一 函式

2021-09-02 09:54:28 字數 2694 閱讀 7194

1. 如果函式體只有一行**,則可以不用寫{},比如

def print(x: int) = println(x)
一行上的多條語句用分號隔開,則只有第一句屬於方法體,例如

def printwithvalue(x: int) : string= println(x); "abc"
上面的**報錯,因為,printwithvalue的方法體只有一句**println(x),而它結果值是unit,因此指定printwithvalue返回string,出現型別返回錯誤。如果將兩條語句包在一起,則正確

def printwithvalue(x: int) : string=
2.無參函式,在呼叫時,不需要寫(),直接寫函式名即是方法呼叫。則**中寫print和print()都是方法呼叫

def print() = println(100)
3. 如果方法明確的指定了返回值的型別,則必須在返回值型別後加等於號,否則可以不加也可以加

def noreturn() =
也可以寫成:

def noreturn()
如下寫法是不正確的:

def noreturn():unit
必須寫成:

def noreturn() :unit =
因此,好的習慣是不論有無返回值,都加=

4.預設函式值,必須出現在最後,即帶有預設值的引數後不能再有不帶預設值的引數了

def add(a: int, b: int = 20, c: int = 30): int =
下面的寫法,不報錯,但是呼叫add(100)則報錯

def add(a: int = 20, b: int, c: int = 30): int =
5. 變長引數,使用t*表示

def sum(elems: int*) : int =
下面的寫法則報錯:

def sum(elems: int*) : int =
提示,sum += _不正確

error:(61, 31) missing parameter type for expanded function ((x$2) => sum.<$plus$eq: error>(x$2))

elems.foreach(_ => sum += _)

^

如下寫法是正確的,使用_指代迴圈的變數,簡單的寫法:

def sum(elems: int*) : int =
6. 方法拋異常,無需檢查checked exception

def exceptionprocessing()  catch 

}

7. 帶有多個(引數)的函式,柯力化

def addxy(x:int)(y:int) : int=
通過如下呼叫:addxy(1)(2)

8. 函式賦值

def addxy(x:int)(y:int) : int=
val copyofaddxy = addxy(1)(_)

println(copyofaddxy(3))

結果是4,這表示部分應用函式,如果不加(_)則是不正確的

9,部分應用函式:

def substract(a: int, b: int, c: int): int =
則如下的第乙個賦值是正確的,剩下的兩個都不正確,

var func1 = substract(_,_,_) ///正確

println(func1(1,5,3))

println(func1(8,3));

println(func1(100))

10. 閉包

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

sum}

呼叫closure(10)(100),注意int=>int是函式sum的型別,即輸入為int,輸出也為int

11.

def myvalue =
呼叫時,println(myvalue)正確,println(myvalue())則報錯,原因是myvalue不是函式,因為定義時沒有加括號def myvalue而不是def myvalue(),這裡的myvalue是乙個值,塊表示式。那麼它的效果跟如下定義乙個使用塊表示式表示的變數是一樣的

val myvalue =
def myfunc() =
println(myfunc())為什麼列印20,因為myfunc沒有指明返回值的型別,那就預設是unit?這個理解是錯誤的,scala的函式定義也可以自動推導函式的返回型別,乙個函式是否有返回值,看引數列表()和方法體{}之間是否有等號,有等號,則把

最後乙個語句的返回值作為函式的返回值(儘管沒有顯式指定函式的返回值),如果沒有使用等號,那麼函式一律返回unit

Scala入門七 scala的泛型

a 上邊界 表達了泛型的型別必須是 某種型別 或某種型別的 子類 案例 override def toset b a set b a 下邊界 表達了泛型的型別必須是 某種型別 或某種型別的 父類 案例 override def toset b a set b a view bounds可以進行某種神...

Scala實現R語言的str match函式操作

r語言的str match函式大概的意思就是 首先找到符合正則匹配規則的字串 只找第乙個 然後後面跟著是每個括號部分裡面的對應正則匹配表示式的字串。依賴 def str match regex regex,waitmatchstring string list string groupcount r...

scala學習筆記(一)

所有的筆記都來自於對於coursea上洛桑聯邦理工學院的scala 函式式程式設計原理課程的理解和摘錄。scala中兩種求值策略,call by value cbv,應用序求值 和call by name cbn,正則序求值 如果化簡表示式由單純的表示式構成,並且它們都會終止,不陷入迴圈,那麼兩種求...