我是.NET开发人员,希望能够开阔一下视野,经过了解现代技术趋势之后,决定尝试学习Scala语言。您能否建议一个良好的入门策略?我是否需要先学习Java语言?有哪些资源或手册可以阅读?是否有任何开源项目可以练习Scala并在其中成长?
谢谢, Dominique
你可以先访问Simply Scala,那里提供在线解释器,可以给你留下第一印象。
有一个经典的资源是Scala for Java Refugees,最初是为从Java转过来的人编写的,但考虑到C# / Java的基础知识非常相似,对你也会非常有帮助。
你不需要先学Java,但需要安装和运行Java运行时/开发工具包。
然后,前往http://www.scala-lang.org/downloads下载适合您操作系统的应用程序包(我总是更喜欢Scala的夜间构建版本,它们比最新的稳定版本有更多的错误修复)。
之后,运行Scala REPL,它基本上是“Simply Scala”离线版(Simply Scala在幕后也使用Scala REPL)。即使许多Java程序员也会首先使用Scala REPL原型设计东西。
如果你更喜欢书本来学习,我可以推荐由Martin Odersky编写的《Scala编程》(第2版)(如果你想从语言设计的角度开始学习并需要一个“参考书”)。也有其他书籍,例如《Programming Scala》,更加面向初学者,但我个人认为《Scala编程》非常出色,并只用那本书学习了Scala。
一个不错的开始Scala的方式是使用集合类。.NET最近添加了类似LINQ和扩展方法的功能,所以对你来说很容易掌握。
这里有一个小示例,可以帮助你入门:
//Define a class with some properties
case class Person(name: String, var age: Int, spokenLanguages: String*)
//Create some persons
val joe = Person("Joe", 42, "English","French","Danish")
val doe = Person("Doe", 23, "English","German")
val don = Person("Don", 11, "Italian","French","Polish")
val bob = Person("Bob", 17, "German")
//Access a property
joe.name
//Don had his 12th birthday!
don.age = 12
//Put the persons into a list
val persons = List(joe, doe, don, bob)
//Divide the list into minors and adults
val (minors, adults) = persons.partition(_.age < 18)
//Get the total age of all persons
val personsTotalAge = persons.map(_.age).sum
//Return a list with only those speaking English
val englishSpeakers = persons.filter(_.spokenLanguages.contains("English"))
//Same as the example above.
val englishSpeakers2 =
for{ person <- persons
language <- person.spokenLanguages
if language == "English"
} yield person
我对C#并不是很熟练,但我认为许多东西可能会看起来相似。
Scala的XML支持的一些示例:
//The shoppingCart for breakfast
val shoppingCart = <list>
<item><name>Tomatoes</name><price>0.30</price><amount>4</amount></item>
<item><name>Eggs</name><price>0.15</price><amount>10</amount></item>
<item><name>Bread</name><price>2.20</price><amount>1</amount></item>
</list>
//How much does it cost?
val total = (shoppingCart \ "item").map(i => (i \ "price").text.toDouble * (i \ "amount").text.toDouble).sum
//This is a Symbol
val sym = 'SomeSymbol
//I'm too lazy to use Strings for XML! (Example for implicits)
implicit def symbol2string(symbol: Symbol) = symbol.name
//Now I can use Symbols too!
val total = (shoppingCart \ 'item).map(i => (i \ 'price).text.toDouble * (i \ 'amount).text.toDouble).sum
获取一本好的参考书。我推荐Odersky、Spoon和Venners所著的《Programming In Scala》。我发现这是最全面的Scala书籍之一。
与学习任何新语言一样,尝试使用Scala编写几个小应用程序。如果您不是函数式编程人员,您可能会以不同的范式编写它,但暂时没关系。尝试在没有使用“var”(请改用“val”),不使用循环,并尽量减少状态更改的情况下编写程序。
使用sbt构建您的程序。我有点犹豫推荐这个,因为您必须学习一个新工具来编写程序。但我发现它是一个很棒的工具来编写Scala应用程序,并且许多Scala项目似乎都在使用sbt。
还可以查看此评论和整个线程,以帮助您过渡到Scala。Struggle against habits formed by Java when migrating to Scala
学习Scala
我认为学习Scala并不需要事先了解Java。但是,了解一些Java的基本知识还是有帮助的,因为大多数Scala文档都会涉及到Java的特性或问题。
关于开源项目,你可以在Github上查看Scala项目。然而,大多数Scala开源项目都是框架。
至于书籍方面,我认为《Programming in Scala》和《Programming Scala》这两本书都非常好。
Twitter(喜欢Scala的公司之一)最近推出了他们自己的完整Scala教程--Scala School。这是一份很棒的指南,我向所有Scala初学者推荐。
Scala学校起初是在Twitter上举办的一系列讲座,旨在准备有经验的工程师成为高效的Scala程序员。…… 我们认为教授Scala最好的方式不是将其视为改进版Java,而是看作一门新语言。没有 Java 经验也没关系。重点在于解释器、面向对象和函数式编程风格以及我们所做的编程风格。我们强调代码可维护性、表达的清晰度以及利用类型系统等方面。
大多数课程除了需要一个Scala REPL之外不需要任何软件。鼓励读者跟随课程并深入学习!将这些课程用作探索语言的起点。
下载并安装Apache Maven,使用它创建一个空的Scala项目并编写经典的Scala hello world应用程序。这将要求您配置Maven在项目目录中创建的pom.xml文件。
然后一遍又一遍地运行mvn compile
,纠正错误,直到它可以编译。
然后运行mvn package
,直到通过所有单元测试为止。
最后,运行mvn scala:run
一旦您构建了一个真正的项目,scala:run有一个选项可以输出从shell脚本或批处理文件运行所需的完整Java命令。
我目前正在开发一个不需要先前编程知识的项目。它将展示结合函数式和命令式编程的优势,并且非常容易跟随。此外,这些文章将涵盖Scala的最佳实践,并使用Scala解决越来越困难的问题。
你应该试一下,第二部分快完成了 :)