如何开始学习Scala

22

我是.NET开发人员,希望能够开阔一下视野,经过了解现代技术趋势之后,决定尝试学习Scala语言。您能否建议一个良好的入门策略?我是否需要先学习Java语言?有哪些资源或手册可以阅读?是否有任何开源项目可以练习Scala并在其中成长?

谢谢, Dominique


阅读《Programming Scala》,真的是一本很好的书 :) - Alois Cochard
10个回答

27

你可以先访问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

是的,它看起来有点类似于LINQ。感谢您的示例和帮助。 - make_sense
以上示例类似于使用.NET集合类的扩展方法。我添加了一个使用for-comprehension执行相同操作的示例,现在看起来真的像LINQ了。还有一个使用XML的示例。 :-) - soc
Scala对XML的支持非常好。 - make_sense
增加了一些暗示的示例。它们可以与C#的隐式转换和扩展方法进行比较,但更为通用和强大。 - soc

8
您不需要先学习Java。您是否熟悉函数式编程?如果是,您应该能够很快上手Scala。无论如何,以下是一些关于如何学习Scala的想法:
  • 获取一本好的参考书。我推荐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


5
Java作为一种语言并不是开始学习Scala所必需的(而且实际上它非常类似于C#,或者说反过来也可以...)。但是一旦你开始使用Scala进行生产性工作,你将会与许多Java库进行交互,并了解到Java世界是一个更广泛的、几乎标准的库星系,而不像.NET世界,很多你需要的东西直接在标准.NET库中。你可以边学边用,但如果没有Java背景,这种经验可能会让你感到压力重重。然而,如果你开始学习Java,情况也是一样的......
其他你可能需要学习的Java特定内容包括:JVM中泛型功能远不如强大,以及Scala如何尝试解决这个问题。
至于Scala本身作为一种语言,从.NET转入,你可能更需要阅读一些有关函数式编程的东西,而不是学习Java。函数式范式是我在最初接触Scala时最无知的部分,也给我在理解Scala网站上的示例代码时带来了最大的麻烦。
打下基础
  • 对于函数式编程,我建议阅读SICP(它在线上是免费的)。
  • 当你学习Java时,尝试看一下F#。它是一种很好的语言,文档齐全,并且“生活”在.NET生态系统中。

学习Scala


谢谢。我同意Java的世界看起来比.NET更广泛,这是我想尝试Scala的原因之一。此外,那里有Lift,据说是MVC框架的先进和有趣的实现,我很想尝试它 :) 我曾经开始阅读SICP。它非常具有挑战性,但它提供了编写程序的新鲜深入的视角。所以可能是时候回到它并完成它了。 - make_sense
@arctic_dev SICP只能帮助你回答“为什么要使用递归”和“为什么要尽力编写不可变代码”的问题。真正让人眼花的是单子、延续、未来等等这些东西,我认为SICP甚至没有开始涉及。但是,尝试理解这些新概念(对我来说)也是我在学习Scala中获得的最有价值的事情之一。 - Paolo Falabella
@arctic_dev:小小的提醒:学习Lift和Scala都很难,因为Lift期望你已经相当熟练地掌握了Scala。 - soc
有没有关于函数式编程的进一步阅读建议?我在博客和文章中阅读了一些关于单子等概念的内容。那么是否有专门讲解这些内容的书籍呢? - make_sense
你现在不必担心单子等问题。我认为SICP是学习函数式编程的最佳途径。此外,在.NET上,你可以看看F#,它是一个很好的.NET函数式语言。 - JWC
@arctic_dev 如果你只想从Scala开始,那么在你需要单子之前可能需要一段时间(如果有的话...)。绝对不要从那里开始,否则你在Scala的经验很可能会很短暂... Raphael的建议是非常宝贵的。为提及单子而道歉... - Paolo Falabella

2
如果你想学习Scala,最好的方法是学习Scala并在学习过程中掌握需要的Java知识。你不需要学习Java就可以开始使用Scala。一个好的起点是阅读这个问题,其中列出了目前可用的大部分Scala书籍。参见链接:https://stackoverflow.com/questions/3359852/scala-programming-book/3360308#3360308。请注意保留HTML标签,但使内容更加通俗易懂。

2

我认为学习Scala并不需要事先了解Java。但是,了解一些Java的基本知识还是有帮助的,因为大多数Scala文档都会涉及到Java的特性或问题。

关于开源项目,你可以在Github上查看Scala项目。然而,大多数Scala开源项目都是框架。

至于书籍方面,我认为《Programming in Scala》和《Programming Scala》这两本书都非常好。


2
除了其他方面之外,先编写一些简单的程序,并完全忽略Scala的高级特性。只有当您掌握了基础知识、函数式范式和类型系统时,才能进入那里。

“从简单开始”对于任何事情都是一个非常好的建议,但对于Scala来说则是必不可少的。这门语言中有太多的东西,试图一次性学习所有内容会特别痛苦... - Paolo Falabella

2

1

Twitter(喜欢Scala的公司之一)最近推出了他们自己的完整Scala教程--Scala School。这是一份很棒的指南,我向所有Scala初学者推荐。

Scala学校起初是在Twitter上举办的一系列讲座,旨在准备有经验的工程师成为高效的Scala程序员。…… 我们认为教授Scala最好的方式不是将其视为改进版Java,而是看作一门新语言。没有 Java 经验也没关系。重点在于解释器、面向对象和函数式编程风格以及我们所做的编程风格。我们强调代码可维护性、表达的清晰度以及利用类型系统等方面。

大多数课程除了需要一个Scala REPL之外不需要任何软件。鼓励读者跟随课程并深入学习!将这些课程用作探索语言的起点。


0

下载并安装Apache Maven,使用它创建一个空的Scala项目并编写经典的Scala hello world应用程序。这将要求您配置Maven在项目目录中创建的pom.xml文件。

然后一遍又一遍地运行mvn compile,纠正错误,直到它可以编译。

然后运行mvn package,直到通过所有单元测试为止。

最后,运行mvn scala:run

一旦您构建了一个真正的项目,scala:run有一个选项可以输出从shell脚本或批处理文件运行所需的完整Java命令。


0

我目前正在开发一个不需要先前编程知识的项目。它将展示结合函数式和命令式编程的优势,并且非常容易跟随。此外,这些文章将涵盖Scala的最佳实践,并使用Scala解决越来越困难的问题。

http://vigtig.it/blog/

你应该试一下,第二部分快完成了 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接