Scala 方法聲明

2022-05-13 15:06 更新

Scala方法聲明具有 def 關(guān)鍵字,方法名稱,參數(shù),可選返回類型,= 關(guān)鍵字,方法body.myMethod不帶參數(shù)并返回String:

def myMethod():String = "o2fo.com"

myOtherMethod 不帶參數(shù)并返回一個String,但是返回類型沒有被顯式聲明,因為編譯器推斷返回類型。

def myOtherMethod() = "Moof"

我們在方法聲明的括號內(nèi)聲明參數(shù)。參數(shù)名稱后面必須是參數(shù)的類型:

def foo(a: Int):String = a.toString

我們可以聲明多個參數(shù):

def f2(a: Int, b:Boolean):String= if (b)a.toString else"false"

我們可以傳遞參數(shù)的類型或返回類型作為參數(shù)。

下面的代碼取一個參數(shù)p和類型參數(shù) T ,并返回一個T List 。

因此,如果你傳遞一個Int,你會得到一個List[Int],如果你傳遞一個String,你會得到一個List[String]

deflist[T](p:T):List[T] = p :: Nil
list(1)
list("Hello")

并且列表中的最后一個參數(shù)可以是可變長度參數(shù)。

如果最后一個參數(shù)是可變長度參數(shù),則它是可變長度參數(shù)類型的Seq,因此在這種情況下as參數(shù)是 Seq[Int]

def largest(as: Int*): Int = as.reduceLeft((a, b)=> a max b)

可變長度參數(shù)方法可以被稱為如下:

largest(1)
largest(2,3,99)
largest(3,22,33,22)

我們可以混合類型參數(shù)和可變長度參數(shù):

def mkString[T](as: T*):String = as.foldLeft("")(_ + _.toString)

我們可以把類型參數(shù)的邊界。在這種情況下,傳入的類型必須是Number或Number的子類:

def sum[T <:Number](as:T*): Double = as.foldLeft(0d)(_ + _.doubleValue)

方法可以在任何代碼范圍內(nèi)聲明,除了在頂層,其中聲明了類,traits和對象。

方法可以引用它們范圍中的任何變量,如下面的代碼所示。

def readLines(br: BufferedReader) = {
    var ret: List[String] = Nil
    def readAll():Unit= br.readLinematch {
        case null =>
        case s => ret ::= s ; readAll()
    }
    readAll()
    ret.reverse
}

覆蓋已聲明方法的方法必須包含override修飾符。

覆蓋抽象方法的方法可以包括覆蓋修飾符。

abstract class Base {
    def thing: String
}
class One extends Base {
    def thing= "Moof"
}
不使用參數(shù)和變量的方法可以以同樣的方式訪問,val可以覆蓋超類中的def,如下面的代碼所示。

class Two extends One{
override val thing= (new java.util.Date).toString
}
class Three extends One{
override lazy val thing= super.thing + (new java.util.Date).toString
}

Call-by-Name

在Scala中,我們可以將參數(shù)傳遞給方法和函數(shù):call-by-name,它將代碼塊傳遞給被調(diào)用者。

每次被叫方訪問參數(shù)時,將執(zhí)行代碼塊并計算該值。

方法調(diào)用

Scala為調(diào)用方法提供了許多句法變體。

有標(biāo)準(zhǔn)的Java點符號:

instance.method()

但是如果一個方法不帶任何參數(shù),尾括號是可選的:

instance.method

這允許沒有參數(shù)方法的方法在目標(biāo)實例上顯示為屬性或字段。

采用單個參數(shù)的方法可以像Java中一樣被調(diào)用:

instance.method(param)

但是可以調(diào)用帶有單個參數(shù)的方法,而不使用圓點或括號:

instance.method param

因為Scala允許方法名稱包含符號,如+, - ,*和?,Scala的點少方法記法創(chuàng)建一個句法中立的方法調(diào)用方法,這是Java中的硬編碼運算符。

object Main {
  def main(args: Array[String]) {
     println(2.1.*(4.3))
     println(2.1* 4.3)
  }
}

最后,我們在Java中調(diào)用多參數(shù)方法:

instance.method(p1, p2)

如果Scala方法接受一個類型參數(shù),wecan也顯式地傳遞類型參數(shù):

instance.method[TypeParam](p1,p2)
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號