2011-03-23 276 views
22

我是.NET開發人員,我想擴大自己的視野並檢查出決定嘗試Scala的現代趨勢。你能建議一個好的策略來開始嗎?我應該先學習Java嗎?我應該閱讀什麼來源或手冊?有沒有任何操作系統項目來練習Scala並在其上成長?如何在Scala上開始

感謝, 多米尼克

+0

閱讀編程Scala,真的很好的書:) – 2011-03-23 13:52:41

回答

26

您可以通過訪問Simply Scala獲得第一印象,在那裏您可以使用在線口譯員。

一個絕對的經典是Scala for Java Refugees它最初是爲來自Java的人編寫的,但是對於你來說,考慮到C#/ Java的基本知識有多相似,對你來說會很有幫助。

您不需要先學習Java,但需要安裝並運行Java運行時/開發工具包。

然後去http://www.scala-lang.org/downloads併爲您的操作系統下載相應的軟件包(我總是喜歡每晚構建Scala,它們比最新的穩定版本有更多的bug修復)。

然後,運行Scala REPL,它基本上是「Simply Scala offline」(Simply Scala也在封面上使用Scala REPL)。甚至很多Java程序員都使用Scala REPL來首先對事物進行原型設計。

如果您更喜歡書籍學習,我可以推薦Martin Odersky的Programming in Scala (2nd edition)(如果您從語言設計的角度出發,想要「參考書」)。還有一些像「編程斯卡拉」這樣的更適合初學者的人,可以這麼說,但是我個人發現「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 
+0

是的,它看起來有點類似於LINQ。感謝你的榜樣和幫助。 – 2011-03-23 14:20:36

+0

上面的例子可以使用.NET集合類的擴展方法。我添加了一個用於理解的示例,它現在應該看起來像LINQ。還有一個使用XML的例子。 :-) – soc 2011-03-23 15:00:12

+0

Scala對XML的支持看起來不錯。 – 2011-03-23 15:14:54

8

你並不需要先學習Java。你熟悉函數式編程嗎?如果你是,你應該能夠很快跳入。無論如何,這裏有一些關於如何學習Scala的想法:

  • 獲得一本很好的參考書。我推薦Odersky,Spoon和Venners在Scala編程。我覺得它是最全面的Scala書籍之一。

  • 就像學習任何新語言一樣,嘗試使用Scala編寫幾個小應用程序。如果你不是一個功能強大的程序員,你可以用不同的模式編程,但現在沒關係。嘗試編寫你的程序,而不使用「var,(使用val來代替)」不使用循環,並儘量減少整體狀態變化。

  • 使用sbt來構建您的程序。我有點猶豫,因爲你必須學習一個新的工具來編寫你的程序。但是我發現編寫Scala應用程序也很棒。許多Scala項目似乎都使用sbt。

  • 此外請查看此評論和該線程總體來說,以幫助您過渡到斯卡拉。 Struggle against habits formed by Java when migrating to Scala

2

我不認爲你需要知道Java才能開始使用Scala。儘管知道廣泛的筆觸是有幫助的,因爲我讀過的大多數Scala文檔都提到了Java功能或錯誤。

關於開源項目,你可以看看Github for scala projects。不過,大多數開源Scala項目往往是框架。

關於書籍,我發現Artima書籍,Scala編程和Pragmatic Programmers編程Scala非常好。

5

Java作爲一種語言不會是必要開始使用Scala(反正Java本身是非常相似的C#,或實際上它是周圍的其他方式.. )。然而,一旦你開始用scala開發高效的東西,你將會與很多java庫進行交互,並且瞭解到java-world是一個比標準庫更多或更少的標準庫,其中大量的你需要的東西直接在標準的.NET庫中。您可以隨時瞭解它們,但不能從java背景中獲得,這種體驗可能會讓人感到壓力。當你開始學習java時,它也是同樣的東西,儘管......你可能需要學習的其他java特定的東西是關於泛型在JVM中的強大程度,以及scala怎樣試圖解決這個問題。

至於scala自身作爲一種來自.NET的語言,您可能從閱讀函數式編程中的一些東西而不是從學習java中受益更多。功能範例是我在最初的scala方法中最不知道的部分,這使我在從scala網站上找到的資源中瞭解示例代碼時遇到了最大的麻煩。

構建基礎

  • 函數式編程我會建議讀SICP(它的在線和免費)。
  • 當你學習java時,試着看看F#。這是一種很好的語言,它有很好的文件記錄和「生活」的。NET的生態系統

學習Scala

+0

謝謝。我同意Java的世界看起來比.NET更廣泛,這是我想嘗試Scala的原因之一。此外,那裏有Lift,據說這是高級的,並且正在執行MVC框架,我很想去嘗試它:)我開始閱讀SICP一次。這非常具有挑戰性,但它爲編寫程序提供了一個全新的視角。所以可能是時候回到它並完成了。 – 2011-03-23 13:45:29

+0

@arctic_dev SICP將幫助你回答「所有這些遞歸事物是什麼」以及「他們爲什麼努力編寫不可變代碼」的問題。真正令人矚目的將是單子,延續,期貨和類似的東西,我認爲SICP甚至沒有開始涉足。但試圖圍繞這些新的(對我來說)概念來說,這也是我通過學習Scala獲得的最有價值的東西之一。 – 2011-03-23 13:55:19

+0

@arctic_dev:就像一個小小的警告:Learning Lift和Scala很難,因爲Lift希望你能很好地瞭解Scala。 – soc 2011-03-23 14:01:31

2

除了其他:寫簡單計劃了一段時間,完全忽略斯卡拉的先進功能。只有在掌握了基本知識,功能範例和類型系統的基礎之後,才能到那裏。

+0

+1「開始簡單」是一個很好的建議,但對於scala來說,它是必不可少的。語言中有這麼多東西,試圖一次學習所有東西特別痛苦...... – 2011-03-23 15:27:01

0

我目前正在開發一個不需要事先編程知識的人。它將顯示功能和命令式編程相結合的優勢,並且非常簡單。此外,這些帖子將涵蓋最佳實踐,並使用Scala解決日益困難的問題。

http://vigtig.it/blog/

你應該給它一個嘗試,第2部分幾乎完成:)

0

下載並安裝Apache Maven的。用它來創建一個空白的Scala項目並編寫經典的Scala hello world應用程序。這將需要您在Maven創建的項目目錄中配置pom.xml文件。

然後反覆運行mvn compile,糾正錯誤直至編譯。

然後運行mvn package,直到您通過所有的unittests。

最後,運行mvn scala:run

一旦你建立一個真正的項目斯卡拉:運行有一個選項可以吐出來從一個shell腳本或批處理文件運行,它需要完整的Java命令。

1

Twitter(斯卡拉愛好者之一)最近推出了自己的斯卡拉完整教程 - Scala School。這是我推薦給所有Scala初學者的令人敬畏的指南。

斯卡拉學校開始作爲一系列在Twitter的講座準備 經驗豐富的工程師是生產率高的Scala程序員。 ...我們 認爲它是最有意義的接近教學斯卡拉,而不是如果它是一個改進的Java,但作爲一種新的語言 。在Java中的經驗不是 預期。重點將圍繞解釋器和 對象功能風格以及編程風格我們在這裏做 。重點將放在維護性,表達的清晰度,並利用類型系統。

大部分課程不需要Scala REPL以外的其他軟件。我們鼓勵 的讀者跟着進一步!使用這些 課程作爲探索語言的起點。