Scala學習(五)

在scala中惟有3個表達式不返回值java

一個是whiledo-while.while在scala叫循環,而不是表達式.是由於它們不能生產有意義的結果.c++

還有一個是finally,若是finally產生結果那根據finally的特性它在函數最後必定會執行那麼try和catch中的結果將毫無心義.永遠只會返回finally中的結果.如def returnTest = try{1}finally{2},那麼returnTest永遠只能是2.全部這和java是不同的.scala中finally不會返回任何內容只用做資源釋放.ide

在scala中任何賦值語句都不會返回被賦值變量的值.只會返回一個"()".函數

var line = ""
while((line = readLine()) != ""){
   println("Read : " + line)
}

這個在java,c,c++中慣用的讀取文本行,在scala中不行.由於line = readLine() 永遠只返回 "()", () != "" 是永遠不相等的.scala

scala> val f = (_:Int) + (_:Int)
f: (Int,Int) => Int = <function>

scala> f(5,10)
res11: Int = 15

請注意_ + _  將擴展成帶兩個參數的函數字面量.這樣也解釋了爲什麼僅當每一個參數在函數字面量中最多出現一次時,你才能使用這種短格式.多個下劃線指代多個參數,而不是單個參數的重複使用.第一個下劃線表明第一個參數,第二個下劃線表明第二個,第三個,........,以此類推.code

定義無參方法:若是你調用的函數執行了操做就使用括號,但若是僅提供了對某個屬性的訪問,那麼省略括號.對象

擴展類:若是你省略extends子句,Scala編譯器將隱式地擴展scala.AnyRef,與java默認繼承java.lang.Object繼承

java中抽象方法必須指定abstract而scala中不須要指定abstract.接口

java有4個命名空間(分別是字段,方法,類型和包),scala僅有2個命名空間:值(包含字段,方法,包還有單例對象),類型(包括類和特質名)資源

scala的Any是任何類的基類

特質與類出了3點以外.其餘都與類同樣.

要點以下:

  1. 特質不能有類參數
  2. Scala中類只能繼承一個超類, 能夠擴展任意數量的特質
  3. 特質能夠要求實現它們的類具有特定的字段, 方法和超類
  4. 與Java接口不一樣, Scala特質能夠提供方法和字段的實現
  5. 當將多個特質疊加使用的時候, 順序很重要
  6. 類中的super是靜態綁定的,特質中的super是動態綁定的.

特質:次序性,粗略的說,越靠近右側的特質越先起做用.當你調用帶混入的類的方法時,最右側特質的方法首先被調用.若是那個方法調用了super,它調用其左側特質的方法,以此類推.

import scala.collection.mutable.ArrayBuffer

abstract class IntQueue {
  def get(): Int

  def put(x: Int)
}

trait Incrementing extends IntQueue {
  abstract override def put(x: Int) = super.put(x + 1)
}

trait Filtering extends IntQueue {
  abstract override def put(x: Int) = if (x >= 0) super.put(x)
}

class BasicIntQueue extends IntQueue {
  private val buf = new ArrayBuffer[Int]()

  override def get(): Int = buf.remove(0)

  override def put(x: Int) {
    buf += x
  }
}

object BasicIntQueue {
  def main(args: Array[String]): Unit = {
    val queue = new BasicIntQueue with Filtering with Incrementing
    queue.put(10)
    queue.put(-1)
    println(queue.get())
    println(queue.get())
  }
}

相關文章
相關標籤/搜索