Scala Tour

November 7, 2013

今天终于下定决心要认真学Scala了,所以去看了Scala Tour,每一个例子都能学到关于Scala的知识,都有一些不明白的东西。下面是我在看Scala Tour是想到的问题,还有是一些“发现”。

Scala Tour本来就不是Tutorial,我是想看看Scala的一些特性,方便在真正看教程的时候更有针对性,不过Scala Tour介绍的特性不多。官方的A Tour of Scala简直就是堆特性,入门不能看。

Basic

def square(a : Int) = a * a  // 可以从参数类型和函数体推导出返回值的类型

def squereDouble(a: Int):Double = a * a  // Int类型的返回值隐式转换到Double?

val logEnable = true

// Call by name
def log(msg: => String) =
    if (logEnable) println(msg)

val MSG = "programing is running"

log("Programing is running"+ 1 / 0)  // 字符串+数字不是应该是个类型错误吗?

// 定义类
class Person(val firstName: String, val lastName: String) {

    private var _age = 0
    def age = _age        // 推导出类型age方法连签名都可以省了

    def age_=(newAge: Int) = _age = newAge
    // 和之前看到的函数定义方法都不同,中间是 =>,而且调用时还能省掉下划线和括号
}

// Duck Typing
def withClose(closeAble: { def close(): Unit },  // 所有定了close方法的对象
    op: { def close(): Unit } => Unit) {
    // 又重复了一遍那个Duck type,有简写方法吗?
    try {
        op(closeAble)
    } finally {
        closeAble.close()
    }
}

// Generic
// <: 表示别名还是子类?
def withClose[A <: { def close(): Unit }, B](closeAble: A)
  (f: A => B): B =
  try {
    f(closeAble)
  } finally {
    closeAble.close()
  }

// Traits
trait ForEachAble[A] {
  // 直接拿到了扩展了这个trait的类的iterator字段?
  // 如果一个类没有这个字段,是不是不能扩展这个trait?
  def iterator: java.util.Iterator[A]

  def foreach(f: A => Unit) = {
    val iter = iterator
    while (iter.hasNext)
      f(iter.next)
  }
}

Functional

// Pattern Matching
def fibonacci(in: Any): Int = in match {  // 参数类型是Any
    case 0 => 0
    case 1 => 1
    case n: Int if (n > 1) => fibonacci(n - 1) + fibonacci(n - 2)
    case n : String => fibonacci(n.toInt)
    // 模式匹配可以匹配不同类型,haskell好像要cast+Dynamic+view pattern?
    case _ => 0
}

// Case Class 有点像ADT
abstract class Expr

case class FibonacciExpr(n: Int) extends Expr {
  require(n >= 0)  // 简直就ADT + smart constructor
}
case class SumExpr(a: Expr, b: Expr) extends Expr

// Ruby's power is from magic, but Scala's power is from science. 2333

Concurrent

 // actor dsl是怎样实现的?
val fromURL = actor(new Act {
  become {
    // sender是那里来的?
    case url: String => sender ! scala.io.Source.fromURL(url)
      .getLines().mkString("\n")
  }
})

Practice

// Extractor好像view pattern
object Email {
  def unapply(str: String): Option[(String,String)] =
    new Regex("""(.*)@(.*)""")
      .unapplySeq(str).get match {
      case user :: domain :: Nil => Some(user, domain)
      case _ => None
    }
}

// implicit 是在词法作用域里有效?
implicit def strToDate(str: String) =
  new SimpleDateFormat("yyyy-MM-dd").parse(str)

最后

最感兴趣的是implicit、实现DSL的方法,还有一些A Tour of Scala里的高级特性。