如何开始scala

mak*_*nse 22 jvm scala

我是.NET开发人员,我想稍微开阔视野,看看现代趋势后决定尝试Scala.你能告诉我一个好的策略吗?我应该先学习Java吗?我应该阅读哪些资料或手册?是否有任何操作系统项目来练习Scala并在其上发展?

谢谢,多米尼克

soc*_*soc 27

您可以通过访问Simply Scala获得第一印象,在那里您可以获得在线翻译.

一个绝对经典的Scala for Java Refugees最初是为来自Java的人编写的,但考虑到C#/ Java的基础知识有多么相似,对你很有帮助.

您不需要首先学习Java,但是您需要安装和运行Java运行时/开发工具包.

然后访问http://www.scala-lang.org/downloads并为您的操作系统下载相应的软件包(我总是喜欢Scala的每晚版本,它们比最新的稳定版本有更多的错误修复).

之后,运行Scala REPL,它基本上是"Simply Scala offline"(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
Run Code Online (Sandbox Code Playgroud)

我不是那么流利的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
Run Code Online (Sandbox Code Playgroud)


JWC*_*JWC 8

您不需要先学习Java.你熟悉函数式编程吗?如果你是,你应该能够很快地跳进去.无论如何,这里有一些关于如何学习Scala的想法:

  • 获得一本好的参考书.我推荐Odersky,Spoon和Venners编写Scala编程.我发现它是最全面的Scala书之一.

  • 与学习任何新语言一样,尝试使用Scala编写几个小应用程序.如果你不是一个功能程序员,你可以用不同的范例编程,但现在没问题.尝试编写程序而不使用"var,(使用val代替)"而不是使用循环,并最大限度地减少状态变化.

  • 使用sbt来构建你的程序.我有点犹豫要推荐这个,因为你必须学习一个新的工具来编写你的程序.但我觉得用Scala编写应用程序也很棒.许多Scala项目似乎都使用sbt.

  • 另外,请查看此评论和整个帖子,以帮助您转换到Scala.在迁移到Scala时,反对Java形成的习惯


Pao*_*lla 5

Java作为一种语言不一定以scala开头(而且无论如何java本身与c#非常相似,或者实际上它是相反的......).但是,一旦你开始使用scala进行高效工作,你将会与许多java库进行交互,并了解java-world是一个更广泛的标准库,而不是.net-world,其中有很多您需要的东西直接在标准的.NET库中.你可以随时学习它们,但不是来自java背景,经验可能会让人感到压力.如果你开始学习java,那将是同样的事情....你可能需要学习的其他特定于Java的东西是关于泛型在JVM中的功能要小得多,以及scala如何解决这个问题.

至于scala本身作为一种来自.NET的语言,你可以从阅读函数式编程的一些东西而不是学习java中获益更多.功能范例是我最初对scala方法最无知的部分,这使我在从scala网站上找到的资源中理解示例代码时遇到的麻烦最多.

建立基础

  • 对于函数式编程,我建议阅读SICP(它是在线和免费的).
  • 在学习java的同时试着看看F#.它是一种很好的语言,它在.NET生态系统中有很好的文档和"生命"

学习斯卡拉