Scala学习(五)

在scala中唯有3个表达式不返回值

一个是whiledo-while.while在scala叫循环,而不是表达式.是因为它们不能生产有意义的结果.

还有一个是finally,如果finally产生结果那根据finally的特性它在函数最后一定会执行那么try和catch中的结果将毫无意义.永远只会返回finally中的结果.如def returnTest = try{1}finally{2},那么returnTest永远只能是2.所有这和java是不一样的.scala中finally不会返回任何内容只用作资源释放.

在scala中任何赋值语句都不会返回被赋值变量的值.只会返回一个"()".

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

这个在java,c,c++中惯用的读取文本行,在scala中不行.因为line = readLine() 永远只返回 "()", () != "" 是永远不相等的.

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

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

请注意_ + _  将扩展成带两个参数的函数字面量.这样也解释了为何仅当每个参数在函数字面量中最多出现一次时,你才能使用这种短格式.多个下划线指代多个参数,而不是单个参数的重复使用.第一个下划线代表第一个参数,第二个下划线代表第二个,第三个,........,以此类推.

定义无参方法:如果你调用的函数执行了操作就使用括号,但如果仅提供了对某个属性的访问,那么省略括号.

扩展类:如果你省略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())
  }
}

猜你喜欢

转载自my.oschina.net/u/2300159/blog/1596249