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,正則序求值 如果化簡表示式由單純的表示式構成,並且它們都會終止,不陷入迴圈,那麼兩種求...