Scala(一):函式、流程控制、引數

奮鬥的only發表於2018-12-13
Function:函式
函式的定義:
def 函式名(引數):返回型別=函式實現體
eg:def abs(x:Long) : Long = if(x >= 0) x else -x
你必須給出所有引數的型別。不過,只要函式不是遞迴的,你就不需要指定返回型別,。Scala編譯器可以通過=符號右邊的表示式的型別推斷出返回型別
如果函式體需要多個表示式完成,可以用程式碼塊,塊中最後一個表示式的值就是函式的返回值
eg:def function1(n:Int) = {
var r = 1
for(i <- 1 to n) r = r * i
r
}
程式碼如下:
/**
  * Created by strugglingonlydata
  *
  */
object Function {
  def abs(x: Long): Long = if (x >= 0) x else -x

  
  def function1(n: Int) = {
    var r = 1
    for (i <- 1 to n) r = r * i
    r
  }

  //無參函式
  def doWhile(): Unit = {
    var line = ""
    do {
      line = readLine()
      println("Read:" + line)
    } while (line != "")
  }

  //有參函式
  def looper(x: Long, y: Long): Long = {
    var a = x
    var b = y
    while (a != 0) {
      val temp = a
      a = b % a
      b = temp
    }
    b
  }

  //在main這個函式中,它是不明確返回值的所以在此用Unit做返回型別
  def main(args: Array[String]): Unit = {
    //無參呼叫的時候也可以不加()
    doWhile()
    //有參函式的呼叫
    println(looper(100,298))
  }

 

引數
1.預設引數
我們在呼叫某些函式時並不顯式的給出所有引數值,對於這些函式我們使用預設引數
eg:
def decorate(str:String,left:String="[",right:String="]")=left+str+right
這個函式有兩個預設的引數left和right,如果你呼叫decorate("hello"),列印結果為:[hello]
或者你給出的引數值的數量不夠,那麼預設引數會從後往前逐個應用進來
eg:decorate("hello","*"),列印結果為:*hello]
2.帶名引數
你也可以在在提供引數值的時候指定引數名
eg:decorate(str="hello",left="*",right="*")
帶名引數並不需要跟引數列表的順序完全一致
3.變長引數
eg:def sum(i:Int*)={
var result=0
for(arg<- args) result +=arg
result
}
     
     val s =sum(1,2,10,20)

變長引數得到的是一個型別為Seq的引數

流程控制:
1.條件表示式:if
Scala的if/else語法結構與Java一樣。不過在Scala中if/else表示式有值,這個值就是跟在if或者else後面的表示式的值
eg:if(x>0) 1 else -1
在Scala中每個表示式都有值,如果沒有值這個問題的解決方案就是引入Unit類,寫作()
eg:if(x>0) 1 else ()
你可以把()當做是表示“無可用值”佔位符,也就是Java中的void.
提示:從技術上講Java中void沒有值,但是Scala中Unit有一個表示"無值"的值
2.迴圈:for、while、dowhile
for迴圈:for (i<-表示式)
說明:在for迴圈的變數之前並沒有val或者var的指定。該變數的型別是集合的元素型別。
增強for迴圈
for(i<-表示式;j<-表示式)使用多個變數<-表示式的形式提供多個生成器,用分號隔開
每個生成器都可以帶一個守衛
eg:if(i<-1 to 3; j <- 1 to 3 if i!=j)
for的推導式
如果for迴圈的迴圈體以yield開始,則該迴圈會構造出一個集合,每次迭代生成集合中的一個值
eg:for(i <- 1 to 10) yield i % 3
生成:Vertor(1,2,0,1,2,0,1,2,0,1)
while迴圈:while(條件語句){迴圈體}
dowhile迴圈在此不多做表述
迴圈變數的作用域一直持續到迴圈結束
說明:Scala中並沒有提供break或者continue語句退出迴圈。那麼如果需要break的時候我們怎麼辦呢?有如下選項:
  1.使用Boolean型的控制變數
  2.使用巢狀函式,你可以從函式中return
  3.使用Breaks物件中的break方法

提示:歡迎大家批評指正,一起交流,一起進步。

相關文章