SlideShare ist ein Scribd-Unternehmen logo
1 von 74
Downloaden Sie, um offline zu lesen
Scala
                     Sparkle




12年3月1日星期四
大纲


             Scala是什么

             语法(特色)

             类库和工具

             缺点




12年3月1日星期四
Scala是什么




12年3月1日星期四
"Which Programming Language would you use *now*
  on top of JVM, except Java?". The answer was
     surprisingly fast and very clear: - Scala.




               http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming




12年3月1日星期四
I can honestly say if someone had shown me
    theProgramming in Scala book by by Martin
 Odersky, Lex Spoon & Bill Venners back in 2003 I'd
       probably have never created Groovy.




                   http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html




12年3月1日星期四
Scala是……




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言

             强类型




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言

             强类型

             “动态的”静态语言




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言

             强类型

             “动态的”静态语言

             函数式




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言

             强类型

             “动态的”静态语言

             函数式

             面向对象




12年3月1日星期四
Scala是……
             又⼀一个JVM上的语言

             强类型

             “动态的”静态语言

             函数式

             面向对象

             并发


12年3月1日星期四
谁在用


             Twitter

             LinkedIn

             FourSquare

             Xerox、Sony、Siemens




12年3月1日星期四
语法(特色)




12年3月1日星期四
Hello world!

               object Test {
               ! def main(args: Array[String]) {
               ! ! println("Hello, world!")
               ! }
               }




12年3月1日星期四
Hello world!

             没有分号     object Test {
                      ! def main(args: Array[String]) {
                      ! ! println("Hello, world!")
                      ! }
                      }




12年3月1日星期四
Hello world!

             没有分号     object Test {
             定义后置
                      ! def main(args: Array[String]) {
                      ! ! println("Hello, world!")
                      ! }
                      }




12年3月1日星期四
Hello world!

             没有分号       object Test {
             定义后置
                        ! def main(args: Array[String]) {
                        ! ! println("Hello, world!")
             object     ! }
                        }




12年3月1日星期四
Hello world!

             没有分号       object Test {
             定义后置
                        ! def main(args: Array[String]) {
                        ! ! println("Hello, world!")
             object     ! }
             def        }




12年3月1日星期四
Hello world!

             没有分号        object Test {
             定义后置
                         ! def main(args: Array[String]) {
                         ! ! println("Hello, world!")
             object      ! }
             def         }

             println



12年3月1日星期四
Hello world!

               object Test extends Application {
               ! println("Hello, world!")
               }




12年3月1日星期四
Hello world!

                         object Test extends Application {
                         ! println("Hello, world!")
                         }
             extends




12年3月1日星期四
Hello world!

                         object Test extends Application {
                         ! println("Hello, world!")
                         }
             extends

             类内直接写代码




12年3月1日星期四
简化




12年3月1日星期四
简化
             val i = 1.2.toInt




12年3月1日星期四
简化
             val i = 1.2.toInt
             val list = List(1, 2, 3)




12年3月1日星期四
简化
             val i = 1.2.toInt
             val list = List(1, 2, 3)

             val map = Map("Guangzhou" -> "GZ",
             "Shenzhen" -> "SZ")




12年3月1日星期四
简化
             val i = 1.2.toInt
             val list = List(1, 2, 3)

             val map = Map("Guangzhou" -> "GZ",
             "Shenzhen" -> "SZ")
             class MyClass(x: Int, y: Int) {}




12年3月1日星期四
简化
             val i = 1.2.toInt
             val list = List(1, 2, 3)

             val map = Map("Guangzhou" -> "GZ",
             "Shenzhen" -> "SZ")
             class MyClass(x: Int, y: Int) {}
             list.exists(_ == 2) //true




12年3月1日星期四
简化
             val i = 1.2.toInt
             val list = List(1, 2, 3)

             val map = Map("Guangzhou" -> "GZ",
             "Shenzhen" -> "SZ")
             class MyClass(x: Int, y: Int) {}
             list.exists(_ == 2) //true
             val (a, b, _) = (x, y, z)


12年3月1日星期四
函数式编程

             list.filter(e => e % 2 == 0)




12年3月1日星期四
函数式编程

             list.filter(e => e % 2 == 0)

               list.filter(_ % 2 == 0)




12年3月1日星期四
open class(ruby)
             class String
              def foo
              "foo"
              end
             end
             puts "".foo # prints "foo"




12年3月1日星期四
为什么我们需要open class




12年3月1日星期四
为什么我们需要open class

             StringUtils.isBlank("some str")




12年3月1日星期四
为什么我们需要open class

             StringUtils.isBlank("some str")

                   "some str".isBlank




12年3月1日星期四
为什么我们需要open class

             StringUtils.isBlank("some str")

                   "some str".isBlank

             myObj should not contains(13)




12年3月1日星期四
隐式转换
class MyString(str: String) {
  def isBlank = str.trim.length == 0
}
implicit def myStringWrapper(str: String) = new
MyString(str)

println("some str".isBlank)




12年3月1日星期四
隐式转换
class MyString(str: String) {
  def isBlank = str.trim.length == 0
}
implicit def myStringWrapper(str: String) = new
MyString(str)

println("some str".isBlank)

             println(new MyString("some str").isBlank)


12年3月1日星期四
open class的效果让大家觉得Scala是动态语言,但选择
   隐式转换来实现,正好证明了Scala是静态语言




12年3月1日星期四
Trait
               class Animal {}
               trait CanFly {
                 def fly {
                   println("fly")
                 }
               }
               class Bird extends Animal
                 with CanFly {}


12年3月1日星期四
Trait
                           class Animal {}
                           trait CanFly {
                             def fly {
             Mixin,类似多集成
                               println("fly")
             接口和实现⼀一起出现      }
             是什么和拥有什么功能
                           }
                           class Bird extends Animal
                             with CanFly {}


12年3月1日星期四
Trait
             class Fish {}
             trait CanFly {
               def fly {
                 println("fly")
               }
             }
             val flyFish = new Fish with CanFly




12年3月1日星期四
Actors
             val myActor = actor {
               loop {
                 react {
                   case "Send" => {
                     println("Get")
                   }
                 }
               }
             }
             myActor ! "Send"

12年3月1日星期四
模式匹配
             def matchTest(x: Any) = x match {
               case 1 => "number one"
               case y: Int if y > 0 => y + 1
               case head :: tail => tail
               case Send(a, _) => a
               case ("Send", _, b: String) => b
               case _ => x
             }



12年3月1日星期四
XML支持


             println(<date>{new java.util.Date()}</date>)




12年3月1日星期四
并发




12年3月1日星期四
是什么让我们觉得⼀一个语言是并发的语言




12年3月1日星期四
是什么让我们觉得Go和Erlang是并发语
            言,而C++和Python不是




12年3月1日星期四
是什么让我们觉得Go和Erlang是并发语
            言,而C++和Python不是




             Go内置Channel和Goroutine

             Erlang的⼀一次赋值、轻量级进程




12年3月1日星期四
是什么让我们觉得Scala
                是并发语言
             val

             case class

             模式匹配

             大量的immutable类

             Actors

             Akka


12年3月1日星期四
与Java互相调用


             Scala能调用绝大部分的Java

             JavaConverters、JavaConversions

             Java调用Scala独有的东西比较困难




12年3月1日星期四
类库和工具




12年3月1日星期四
Lift



             full stack

             view first




12年3月1日星期四
Play!



             Play Scala




12年3月1日星期四
Play!



             Play Scala

             Play 2.0 !!




12年3月1日星期四
Akka


             STM & Transactors

             Fault-tolerance

             Transparent Remoting

             Scala & Java API




12年3月1日星期四
sbt



             构建工具




12年3月1日星期四
更多


             Xitrum

             Scalatra、Scalate

             ScalaTest、specs2

             Squeryl




12年3月1日星期四
IDE支持




12年3月1日星期四
缺点




12年3月1日星期四
It took about 15 hours to recreate the publishing
  daemon in Clojure and get it to pass all our tests.
     Today we ran a "soak test" publishing nearly
  300,000 profiles in one run. The Scala code would
  fail with OoM exceptions if we hit it with 50,000
          profiles in one run (sometimes less).


                  http://groups.google.com/group/clojure/browse_thread/thread/b18f9006c068f0a0




12年3月1日星期四
The e-mail confirms that Yammer is moving its basic
infrastructure stack from Scala back to Java, owing
     to issues with complexity and performance.




                              http://www.infoq.com/news/2011/11/yammer-scala




12年3月1日星期四
flatMap [B, That] (f: (A)        Traversable[B])(implicit bf:
             CanBuildFrom[List[A], B, That]) : That




                                     http://goodstuff.im/yes-virginia-scala-is-hard




12年3月1日星期四
jetbrains出了新JVM语言Kotlin后,Scala社区终于开始
           正视Scala太复杂的问题了




             http://groups.google.com/group/scalacn/browse_thread/thread/cbbe5997009db919




12年3月1日星期四
缺点


             编译速度

             二进制不兼容

             语法越来越复杂

             太少人使用,招聘开发人员的问题




12年3月1日星期四
如何开始使用




12年3月1日星期四
如何开始使用
             使用最新版




12年3月1日星期四
如何开始使用
             使用最新版

             先别用高级特性




12年3月1日星期四
如何开始使用
             使用最新版

             先别用高级特性

             小工具、单元测试




12年3月1日星期四
如何开始使用
             使用最新版

             先别用高级特性

             小工具、单元测试

             逐步迁移




12年3月1日星期四
如何开始使用
             使用最新版

             先别用高级特性

             小工具、单元测试

             逐步迁移

             sbt




12年3月1日星期四
如何开始使用
             使用最新版

             先别用高级特性

             小工具、单元测试

             逐步迁移

             sbt

             idea scala插件


12年3月1日星期四
谢谢


             weibo&twitter: sparklezeng

             email: popeast@gmail.com

             website: http://weavesky.com




12年3月1日星期四

Weitere ähnliche Inhalte

Mehr von 勇浩 赖

论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。勇浩 赖
 
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构勇浩 赖
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选勇浩 赖
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式勇浩 赖
 
珠三角技术沙龙广州场
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场勇浩 赖
 
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?勇浩 赖
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用勇浩 赖
 
Behavior+tree+ai lite
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite勇浩 赖
 
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法勇浩 赖
 
先用再学 - 借助 Xna 快速开发游戏原型
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型勇浩 赖
 
关于Bitworld的一些话题222
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222勇浩 赖
 
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏勇浩 赖
 
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源勇浩 赖
 
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪勇浩 赖
 
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做勇浩 赖
 
如何做好沙龙演讲
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲勇浩 赖
 

Mehr von 勇浩 赖 (20)

论 Python 与设计模式。
论 Python 与设计模式。论 Python 与设计模式。
论 Python 与设计模式。
 
一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构一种多屏时代的通用 web 应用架构
一种多屏时代的通用 web 应用架构
 
Tp web
Tp webTp web
Tp web
 
2012,我的技术之选
2012,我的技术之选2012,我的技术之选
2012,我的技术之选
 
页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式页游开发中的 Python 组件与模式
页游开发中的 Python 组件与模式
 
珠三角技术沙龙广州场
珠三角技术沙龙广州场珠三角技术沙龙广州场
珠三角技术沙龙广州场
 
为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?为什么 rust-lang 吸引我?
为什么 rust-lang 吸引我?
 
Python 于 webgame 的应用
Python 于 webgame 的应用Python 于 webgame 的应用
Python 于 webgame 的应用
 
Behavior+tree+ai lite
Behavior+tree+ai liteBehavior+tree+ai lite
Behavior+tree+ai lite
 
敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法敏捷网游架构与性能的新玩法
敏捷网游架构与性能的新玩法
 
先用再学 - 借助 Xna 快速开发游戏原型
先用再学  - 借助 Xna 快速开发游戏原型先用再学  - 借助 Xna 快速开发游戏原型
先用再学 - 借助 Xna 快速开发游戏原型
 
关于Bitworld的一些话题222
关于Bitworld的一些话题222关于Bitworld的一些话题222
关于Bitworld的一些话题222
 
Stekin
StekinStekin
Stekin
 
03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏03 -黄朝兴--腾讯游戏
03 -黄朝兴--腾讯游戏
 
abu.rpc intro
abu.rpc introabu.rpc intro
abu.rpc intro
 
06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源06 -甄焱琨--知识转化为资源
06 -甄焱琨--知识转化为资源
 
07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪07 -林伟铃--成长中的36氪
07 -林伟铃--成长中的36氪
 
01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做01 -阿朱--简单事情夯实做
01 -阿朱--简单事情夯实做
 
Python 温故
Python 温故Python 温故
Python 温故
 
如何做好沙龙演讲
如何做好沙龙演讲如何做好沙龙演讲
如何做好沙龙演讲
 

Scala

  • 1. Scala Sparkle 12年3月1日星期四
  • 2. 大纲 Scala是什么 语法(特色) 类库和工具 缺点 12年3月1日星期四
  • 4. "Which Programming Language would you use *now* on top of JVM, except Java?". The answer was surprisingly fast and very clear: - Scala. http://www.adam-bien.com/roller/abien/entry/java_net_javaone_which_programming 12年3月1日星期四
  • 5. I can honestly say if someone had shown me theProgramming in Scala book by by Martin Odersky, Lex Spoon & Bill Venners back in 2003 I'd probably have never created Groovy. http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html 12年3月1日星期四
  • 7. Scala是…… 又⼀一个JVM上的语言 12年3月1日星期四
  • 8. Scala是…… 又⼀一个JVM上的语言 强类型 12年3月1日星期四
  • 9. Scala是…… 又⼀一个JVM上的语言 强类型 “动态的”静态语言 12年3月1日星期四
  • 10. Scala是…… 又⼀一个JVM上的语言 强类型 “动态的”静态语言 函数式 12年3月1日星期四
  • 11. Scala是…… 又⼀一个JVM上的语言 强类型 “动态的”静态语言 函数式 面向对象 12年3月1日星期四
  • 12. Scala是…… 又⼀一个JVM上的语言 强类型 “动态的”静态语言 函数式 面向对象 并发 12年3月1日星期四
  • 13. 谁在用 Twitter LinkedIn FourSquare Xerox、Sony、Siemens 12年3月1日星期四
  • 15. Hello world! object Test { ! def main(args: Array[String]) { ! ! println("Hello, world!") ! } } 12年3月1日星期四
  • 16. Hello world! 没有分号 object Test { ! def main(args: Array[String]) { ! ! println("Hello, world!") ! } } 12年3月1日星期四
  • 17. Hello world! 没有分号 object Test { 定义后置 ! def main(args: Array[String]) { ! ! println("Hello, world!") ! } } 12年3月1日星期四
  • 18. Hello world! 没有分号 object Test { 定义后置 ! def main(args: Array[String]) { ! ! println("Hello, world!") object ! } } 12年3月1日星期四
  • 19. Hello world! 没有分号 object Test { 定义后置 ! def main(args: Array[String]) { ! ! println("Hello, world!") object ! } def } 12年3月1日星期四
  • 20. Hello world! 没有分号 object Test { 定义后置 ! def main(args: Array[String]) { ! ! println("Hello, world!") object ! } def } println 12年3月1日星期四
  • 21. Hello world! object Test extends Application { ! println("Hello, world!") } 12年3月1日星期四
  • 22. Hello world! object Test extends Application { ! println("Hello, world!") } extends 12年3月1日星期四
  • 23. Hello world! object Test extends Application { ! println("Hello, world!") } extends 类内直接写代码 12年3月1日星期四
  • 25. 简化 val i = 1.2.toInt 12年3月1日星期四
  • 26. 简化 val i = 1.2.toInt val list = List(1, 2, 3) 12年3月1日星期四
  • 27. 简化 val i = 1.2.toInt val list = List(1, 2, 3) val map = Map("Guangzhou" -> "GZ", "Shenzhen" -> "SZ") 12年3月1日星期四
  • 28. 简化 val i = 1.2.toInt val list = List(1, 2, 3) val map = Map("Guangzhou" -> "GZ", "Shenzhen" -> "SZ") class MyClass(x: Int, y: Int) {} 12年3月1日星期四
  • 29. 简化 val i = 1.2.toInt val list = List(1, 2, 3) val map = Map("Guangzhou" -> "GZ", "Shenzhen" -> "SZ") class MyClass(x: Int, y: Int) {} list.exists(_ == 2) //true 12年3月1日星期四
  • 30. 简化 val i = 1.2.toInt val list = List(1, 2, 3) val map = Map("Guangzhou" -> "GZ", "Shenzhen" -> "SZ") class MyClass(x: Int, y: Int) {} list.exists(_ == 2) //true val (a, b, _) = (x, y, z) 12年3月1日星期四
  • 31. 函数式编程 list.filter(e => e % 2 == 0) 12年3月1日星期四
  • 32. 函数式编程 list.filter(e => e % 2 == 0) list.filter(_ % 2 == 0) 12年3月1日星期四
  • 33. open class(ruby) class String  def foo  "foo"  end end puts "".foo # prints "foo" 12年3月1日星期四
  • 35. 为什么我们需要open class StringUtils.isBlank("some str") 12年3月1日星期四
  • 36. 为什么我们需要open class StringUtils.isBlank("some str") "some str".isBlank 12年3月1日星期四
  • 37. 为什么我们需要open class StringUtils.isBlank("some str") "some str".isBlank myObj should not contains(13) 12年3月1日星期四
  • 38. 隐式转换 class MyString(str: String) { def isBlank = str.trim.length == 0 } implicit def myStringWrapper(str: String) = new MyString(str) println("some str".isBlank) 12年3月1日星期四
  • 39. 隐式转换 class MyString(str: String) { def isBlank = str.trim.length == 0 } implicit def myStringWrapper(str: String) = new MyString(str) println("some str".isBlank) println(new MyString("some str").isBlank) 12年3月1日星期四
  • 40. open class的效果让大家觉得Scala是动态语言,但选择 隐式转换来实现,正好证明了Scala是静态语言 12年3月1日星期四
  • 41. Trait class Animal {} trait CanFly { def fly { println("fly") } } class Bird extends Animal with CanFly {} 12年3月1日星期四
  • 42. Trait class Animal {} trait CanFly { def fly { Mixin,类似多集成 println("fly") 接口和实现⼀一起出现 } 是什么和拥有什么功能 } class Bird extends Animal with CanFly {} 12年3月1日星期四
  • 43. Trait class Fish {} trait CanFly { def fly { println("fly") } } val flyFish = new Fish with CanFly 12年3月1日星期四
  • 44. Actors val myActor = actor { loop { react { case "Send" => { println("Get") } } } } myActor ! "Send" 12年3月1日星期四
  • 45. 模式匹配 def matchTest(x: Any) = x match { case 1 => "number one" case y: Int if y > 0 => y + 1 case head :: tail => tail case Send(a, _) => a case ("Send", _, b: String) => b case _ => x } 12年3月1日星期四
  • 46. XML支持 println(<date>{new java.util.Date()}</date>) 12年3月1日星期四
  • 49. 是什么让我们觉得Go和Erlang是并发语 言,而C++和Python不是 12年3月1日星期四
  • 50. 是什么让我们觉得Go和Erlang是并发语 言,而C++和Python不是 Go内置Channel和Goroutine Erlang的⼀一次赋值、轻量级进程 12年3月1日星期四
  • 51. 是什么让我们觉得Scala 是并发语言 val case class 模式匹配 大量的immutable类 Actors Akka 12年3月1日星期四
  • 52. 与Java互相调用 Scala能调用绝大部分的Java JavaConverters、JavaConversions Java调用Scala独有的东西比较困难 12年3月1日星期四
  • 54. Lift full stack view first 12年3月1日星期四
  • 55. Play! Play Scala 12年3月1日星期四
  • 56. Play! Play Scala Play 2.0 !! 12年3月1日星期四
  • 57. Akka STM & Transactors Fault-tolerance Transparent Remoting Scala & Java API 12年3月1日星期四
  • 58. sbt 构建工具 12年3月1日星期四
  • 59. 更多 Xitrum Scalatra、Scalate ScalaTest、specs2 Squeryl 12年3月1日星期四
  • 62. It took about 15 hours to recreate the publishing daemon in Clojure and get it to pass all our tests. Today we ran a "soak test" publishing nearly 300,000 profiles in one run. The Scala code would fail with OoM exceptions if we hit it with 50,000 profiles in one run (sometimes less). http://groups.google.com/group/clojure/browse_thread/thread/b18f9006c068f0a0 12年3月1日星期四
  • 63. The e-mail confirms that Yammer is moving its basic infrastructure stack from Scala back to Java, owing to issues with complexity and performance. http://www.infoq.com/news/2011/11/yammer-scala 12年3月1日星期四
  • 64. flatMap [B, That] (f: (A) Traversable[B])(implicit bf: CanBuildFrom[List[A], B, That]) : That http://goodstuff.im/yes-virginia-scala-is-hard 12年3月1日星期四
  • 65. jetbrains出了新JVM语言Kotlin后,Scala社区终于开始 正视Scala太复杂的问题了 http://groups.google.com/group/scalacn/browse_thread/thread/cbbe5997009db919 12年3月1日星期四
  • 66. 缺点 编译速度 二进制不兼容 语法越来越复杂 太少人使用,招聘开发人员的问题 12年3月1日星期四
  • 68. 如何开始使用 使用最新版 12年3月1日星期四
  • 69. 如何开始使用 使用最新版 先别用高级特性 12年3月1日星期四
  • 70. 如何开始使用 使用最新版 先别用高级特性 小工具、单元测试 12年3月1日星期四
  • 71. 如何开始使用 使用最新版 先别用高级特性 小工具、单元测试 逐步迁移 12年3月1日星期四
  • 72. 如何开始使用 使用最新版 先别用高级特性 小工具、单元测试 逐步迁移 sbt 12年3月1日星期四
  • 73. 如何开始使用 使用最新版 先别用高级特性 小工具、单元测试 逐步迁移 sbt idea scala插件 12年3月1日星期四
  • 74. 谢谢 weibo&twitter: sparklezeng email: popeast@gmail.com website: http://weavesky.com 12年3月1日星期四