亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

scala函數怎么定義和調用

發布時間:2021-12-08 14:52:16 來源:億速云 閱讀:263 作者:iii 欄目:大數據

這篇文章主要介紹“scala函數怎么定義和調用”,在日常操作中,相信很多人在scala函數怎么定義和調用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”scala函數怎么定義和調用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

一、函數的定義和調用 def

scala定義函數時,需要用def做修飾,然后指定函數名,參數和函數體,在參數列表和函數體中加上 = 號,如下:

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

可以看出,參數用冒號指定其類型,不同參數逗號分隔開,使用時直接調用函數名,指定參數即可

scala的函數也能擁有返回值,跟java不同,scala并不適用return,而是一條語句的最后一個值就是返回值,說起來拗口,直接上代碼:

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分支打印輸出之后都有一個單獨一行的age,這就是返回值,scala對于函數的返回值基本都可以自動推斷出來,但在這里還是額外說一下,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.

看出區別了嗎,對,就在def sayAge(age : Int):Int這里,參數列表后使用冒號加類型的方式指定函數返回值

如果函數體不是多行,也可以簡化去掉大括號,如下:

scala> def sayHello(name : String) = println("my name is " + name)
sayHello: (name: String)Unit

scala> sayHello("xiaoming")
my name is xiaoming

二、默認參數和帶名參數

有時候我們希望不給參數具體值,而是使用參數默認值,scala可以做到這一點

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沒有默認值,必須要手動傳值,age給出默認值18,使用時就能讀取到

scala還支持以不按照函數定義的參數順序來傳遞參數,也就是帶名參數

scala> sayHello(age = 50,name = "Dad")
name:Dad age:50

像這樣把參數顛倒也是可以正常使用的

三、變長參數
有時候我們需要函數參數個數可變,這時候可以使用變長參數

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

注意到參數類型Int后面的*號了嗎?這就是變長參數的語法,代表調用時可以傳入多個Int類型

還有一種情況,我們不想寫(1,3,5,6)這樣的參數,而是前面說過的1 to 4這樣的參數,可以嗎?事實上不行,因為1 to 4本質上是RichInt類型, 而變長參數需要的是多個單Int類型,這時候就需要新的解決辦法:

//:_*告訴編譯器你希望將某個參數當作參數序列處理
scala> sum(1 to 4:_*)
res3: Int = 10

四、過程
過程其實是個非常簡單的概念,如果一個scala函數的函數名和函數體之間沒有使用等號連接,只是用花括號包住了函數體,那他的返回值類型就是Unit,總結一下:過程就是返回值為Unit,也就是不需要返回值的函數

scala> def say(name: String) { print("Hello, " + name)}
say: (name: String)Unit

scala> say("daXin")
Hello, daXin

五、lazy和異常機制
lazy:把一個變量聲明為lazy,那么這個變量只有在真正使用的時候才會被加載,適用于耗時操作,或者只有觸發某些特殊情況才會調用的變量

//定義一個長度為5的數組
scala> var slist = 1 to 5
slist: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5)
//已經越界,但是lazy變量不報錯
scala> lazy val e = slist(5)
e: Int = <lazy>
//在使用的時候才會報錯
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(<console>:15)
 at .e(<console>:15)
 ... 32 elided

//而且lazy只能使用val定義,var會報錯
scala> lazy var num = slist(2)
<console>:1: error: lazy not allowed here. Only vals can be lazy
lazy var num = slist(2)

scala的異常和java很像,我們來看看

//引入io包,下面會用到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沒有(),花括號內是case來判斷不同異常,上面拋出Illegal異常,所以IO異常會跳過,在下面被捕獲到
//順便一提拋出的異常如果沒有相應的case能捕獲,就會報錯
   case e1:IOException =>print("IO fail")
   case e2:IllegalArgumentException =>print("Illegal fail")
}

// Exiting paste mode, now interpreting.

Illegal fail

到此,關于“scala函數怎么定義和調用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

远安县| 封开县| 盐津县| 富顺县| 蓬安县| 许昌市| 马边| 酉阳| 张家港市| 苍南县| 新竹县| 岢岚县| 雷山县| 南投县| 广汉市| 九龙城区| 宜州市| 阳城县| 鹿泉市| 额济纳旗| 曲水县| 安塞县| 四子王旗| 莱西市| 枣阳市| 晋州市| 万山特区| 师宗县| 垫江县| 舞阳县| 巴彦县| 娄烦县| 乐业县| 抚松县| 德阳市| 溧水县| 白水县| 双鸭山市| 云林县| 莲花县| 墨江|