今天终于下定决心要认真学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里的高级特性。