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 }
在Scala中,我們可以將參數(shù)傳遞給方法和函數(shù):call-by-name,它將代碼塊傳遞給被調(diào)用者。
每次被叫方訪問參數(shù)時,將執(zhí)行代碼塊并計算該值。
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)
更多建議: