這篇文章主要介紹“scala函數(shù)怎么定義和調(diào)用”,在日常操作中,相信很多人在scala函數(shù)怎么定義和調(diào)用問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”scala函數(shù)怎么定義和調(diào)用”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!
在布爾津等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供做網(wǎng)站、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷(xiāo)型網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站建設(shè),布爾津網(wǎng)站建設(shè)費(fèi)用合理。
一、函數(shù)的定義和調(diào)用def
scala定義函數(shù)時(shí),需要用def做修飾,然后指定函數(shù)名,參數(shù)和函數(shù)體,在參數(shù)列表和函數(shù)體中加上 = 號(hào),如下:
scala> :paste
// Entering paste mode (ctrl-D to finish)
def say(name : String,age : Int)={
println("my name is"+name+",my age is"+age)
}
// Exiting paste mode, now interpreting.
say: (name: String, age: Int)Unit
scala> say("xiaoming",18)
my name isxiaoming,my age is18
可以看出,參數(shù)用冒號(hào)指定其類型,不同參數(shù)逗號(hào)分隔開(kāi),使用時(shí)直接調(diào)用函數(shù)名,指定參數(shù)即可
scala的函數(shù)也能擁有返回值,跟java不同,scala并不適用return,而是一條語(yǔ)句的最后一個(gè)值就是返回值,說(shuō)起來(lái)拗口,直接上代碼:
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayage(age : Int)={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}
// Exiting paste mode, now interpreting.
sayage: (age: Int)Int
scala> sayage(22)
I am a adult 22
res4: Int = 22
在上面的代碼我們可以看出,if分支打印輸出之后都有一個(gè)單獨(dú)一行的age,這就是返回值,scala對(duì)于函數(shù)的返回值基本都可以自動(dòng)推斷出來(lái),但在這里還是額外說(shuō)一下,scala是可以自己指定返回值的,如下:
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayAge(age : Int):Int ={
if(age >= 18){
println("I am a adult "+ age)
age
}else{
println("I am a children "+ age)
age
}
}
// Exiting paste mode, now interpreting.
看出區(qū)別了嗎,對(duì),就在def sayAge(age : Int):Int
這里,參數(shù)列表后使用冒號(hào)加類型的方式指定函數(shù)返回值
如果函數(shù)體不是多行,也可以簡(jiǎn)化去掉大括號(hào),如下:
scala> def sayHello(name : String) = println("my name is " + name)
sayHello: (name: String)Unit
scala> sayHello("xiaoming")
my name is xiaoming
二、默認(rèn)參數(shù)和帶名參數(shù)
有時(shí)候我們希望不給參數(shù)具體值,而是使用參數(shù)默認(rèn)值,scala可以做到這一點(diǎn)
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sayHello(name:String,age:Int = 18)=print("name:"+name+" age:"+age)
// Exiting paste mode, now interpreting.
sayHello: (name: String, age: Int)Unit
scala> sayHello("DaXin")
name:DaXin age:18
如上圖代碼所示,name沒(méi)有默認(rèn)值,必須要手動(dòng)傳值,age給出默認(rèn)值18,使用時(shí)就能讀取到
scala還支持以不按照函數(shù)定義的參數(shù)順序來(lái)傳遞參數(shù),也就是帶名參數(shù)
scala> sayHello(age = 50,name = "Dad")
name:Dad age:50
像這樣把參數(shù)顛倒也是可以正常使用的
三、變長(zhǎng)參數(shù)
有時(shí)候我們需要函數(shù)參數(shù)個(gè)數(shù)可變,這時(shí)候可以使用變長(zhǎng)參數(shù)
scala> :paste
// Entering paste mode (ctrl-D to finish)
def sum(numbers : Int*) = {
var result = 0;
for(number <- numbers){
result = result+number
}
result
}
// Exiting paste mode, now interpreting.
sum: (numbers: Int*)Int
scala> sum(1,3,5,6)
res2: Int = 15
注意到參數(shù)類型Int后面的*號(hào)了嗎?這就是變長(zhǎng)參數(shù)的語(yǔ)法,代表調(diào)用時(shí)可以傳入多個(gè)Int類型
還有一種情況,我們不想寫(xiě)(1,3,5,6)
這樣的參數(shù),而是前面說(shuō)過(guò)的1 to 4
這樣的參數(shù),可以嗎?事實(shí)上不行,因?yàn)?code>1 to 4本質(zhì)上是RichInt類型, 而變長(zhǎng)參數(shù)需要的是多個(gè)單Int類型,這時(shí)候就需要新的解決辦法:
//:_*告訴編譯器你希望將某個(gè)參數(shù)當(dāng)作參數(shù)序列處理
scala> sum(1 to 4:_*)
res3: Int = 10
四、過(guò)程
過(guò)程其實(shí)是個(gè)非常簡(jiǎn)單的概念,如果一個(gè)scala函數(shù)的函數(shù)名和函數(shù)體之間沒(méi)有使用等號(hào)連接,只是用花括號(hào)包住了函數(shù)體,那他的返回值類型就是Unit,總結(jié)一下:過(guò)程就是返回值為Unit,也就是不需要返回值的函數(shù)
scala> def say(name: String) { print("Hello, " + name)}
say: (name: String)Unit
scala> say("daXin")
Hello, daXin
五、lazy和異常機(jī)制
lazy:把一個(gè)變量聲明為lazy,那么這個(gè)變量只有在真正使用的時(shí)候才會(huì)被加載,適用于耗時(shí)操作,或者只有觸發(fā)某些特殊情況才會(huì)調(diào)用的變量
//定義一個(gè)長(zhǎng)度為5的數(shù)組
scala> var slist = 1 to 5
slist: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
//已經(jīng)越界,但是lazy變量不報(bào)錯(cuò)
scala> lazy val e = slist(5)
e: Int =
//在使用的時(shí)候才會(huì)報(bào)錯(cuò)
scala> e
java.lang.IndexOutOfBoundsException: 5
at scala.collection.immutable.Range.apply$mcII$sp(Range.scala:151)
at scala.collection.immutable.Range.apply(Range.scala:149)
at .e$lzycompute(:15)
at .e(:15)
... 32 elided
//而且lazy只能使用val定義,var會(huì)報(bào)錯(cuò)
scala> lazy var num = slist(2)
:1: error: lazy not allowed here. Only vals can be lazy
lazy var num = slist(2)
scala的異常和java很像,我們來(lái)看看
//引入io包,下面會(huì)用到IO異常
scala> import java.io._
import java.io._
scala> :paste
// Entering paste mode (ctrl-D to finish)
try{//拋出Illegal異常
throw new IllegalArgumentException("error")
}catch{
//scala的catch沒(méi)有(),花括號(hào)內(nèi)是case來(lái)判斷不同異常,上面拋出Illegal異常,所以IO異常會(huì)跳過(guò),在下面被捕獲到
//順便一提拋出的異常如果沒(méi)有相應(yīng)的case能捕獲,就會(huì)報(bào)錯(cuò)
case e1:IOException =>print("IO fail")
case e2:IllegalArgumentException =>print("Illegal fail")
}
// Exiting paste mode, now interpreting.
Illegal fail
到此,關(guān)于“scala函數(shù)怎么定義和調(diào)用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!