2018年第40周-scala入門-工具使用

工慾善其事必先利其器

簡介

Scala是一個什麼樣的語言,很多人都可以百度到。 而且很多人學Scala,也是爲了想能夠靈活的運用spark來處理大數據。
在學習某門語言之前,先要熟悉其環境或工具。而表達工具是怎樣使用,其實最好的媒介載體是視頻。
所以有條件還是看視頻,我這僅僅作爲文字備忘。

安裝

現在官網的入門教程,只有兩個,一個是從Intellj,環境都集成在IDE裏了。而另一個是純命令行,而這純命令行就有點特別,不是類似於Java那樣,直接javac和java直接編譯運行。這命令行入門,是直接一上來,就用一個scala的構建工具sbt(Simple Build Tool)。這個構建工具可以簡單理解爲maven先。

題外話,一上來就要學習一個新的構建工具,嗯,感覺不太友好,因爲連scala是什麼都沒弄清楚,又得學習新的東西。靜下心來,彆着急,我就硬着頭皮先學一學這工具。
我用的環境是deepin操作系統,是基於Debian的linux操作系統。所以我採用Linux安裝:
1.安裝JDK8
1.1下載JDK8
1.2解壓JDK8
tar -zxvf jdk-8u151-linux-x64.tar.gz

1.3配置環境變量/etc/profile

export JAVA_HOME=/home/nescafe/jdk/jdk1.8.0_151 
export PATH=$JAVA_HOME/bin:$PATH

2.通過APT軟件包管理工具安裝(此過程可能會受網絡影響)

echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt

其他安裝sbt方式詳情請點擊

Hello Wrold

通過sbt的項目

新建項目

1.使用sbt new命令

nescafe@nescafe-PC:~/jc-demo/scala$ sbt new sbt/scala-seed.g8
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
[info] Set current project to scala (in build file:/home/nescafe/jc-demo/scala/)
[info] Set current project to scala (in build file:/home/nescafe/jc-demo/scala/)

A minimal Scala project. 

name [Scala Seed Project]: hello

Template applied in ./hello

nescafe@nescafe-PC:~/jc-demo/scala$ tree
.
└── hello
    ├── build.sbt
    ├── project
    │   ├── build.properties
    │   └── Dependencies.scala
    └── src
        ├── main
        │   └── scala
        │       └── example
        │           └── Hello.scala
        └── test
            └── scala
                └── example
                    └── HelloSpec.scala

9 directories, 5 files 

在name那邊輸入欄裏輸入hello,然後就會創建一個新項目hello在當前目錄下。

目錄結構

基目錄(Base ditectory)

在sbt術語中,項目的目錄叫“基目錄(Base ditectory)”。在上面例子中,hello項目包含hello/build.sbt文件,所以hello是基目錄。

源碼

sbt使用的目錄結構跟maven一樣,以下是相對於基目錄的路徑:

src/
  main/
    resources/
      <包含jar包>
    scala/
       <包含scala源碼>
    java/
       <包含java源碼>
  test/
    resources
       <包含測試用的jar包>
    scala/
      <包含測試用的scala源碼>
    java/
       <包含測試用的java源碼>

除了上述目錄外的源碼目錄,其他源碼目錄(包括隱藏目錄)也會被sbt忽略。

sbt構建定義文件(sbt build definition files)

構建定義的內容都在build.sbt文件中。

運行

運行程序

進入hello目錄,在sbt命令行裏執行run命令。

nescafe@nescafe-PC:~/jc-demo/scala$ cd hello/
nescafe@nescafe-PC:~/jc-demo/scala/hello$ sbt
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
[info] Loading project definition from /home/nescafe/jc-demo/scala/hello/project
[info] Updating ProjectRef(uri("file:/home/nescafe/jc-demo/scala/hello/project/"), "hello-build")...
[info] Done updating.
[info] Compiling 1 Scala source to /home/nescafe/jc-demo/scala/hello/project/target/scala-2.12/sbt-1.0/classes ...
[info] Done compiling.
[info] Loading settings from build.sbt ...
[info] Set current project to Hello (in build file:/home/nescafe/jc-demo/scala/hello/)
[info] sbt server started at local:///home/nescafe/.sbt/1.0/server/0b234651a6ca6d6afea4/sock
sbt:Hello> run
[info] Updating ...
[info] Done updating.
[info] Compiling 1 Scala source to /home/nescafe/jc-demo/scala/hello/target/scala-2.12/classes ...
[info] Done compiling.
[info] Packaging /home/nescafe/jc-demo/scala/hello/target/scala-2.12/hello_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running example.Hello 
hello
[success] Total time: 5 s, completed Oct 8, 2018 3:50:40 PM
sbt:Hello> 

在日常寫代碼,我們建議使用sbt命令行或以下持續構建測試的工具。

持續構建測試(Continuous build and test)

爲了加快“編輯-編譯-測試”這個流程。sbt可以在修改源碼後自動編譯和測試。
進入sbt命令行後,執行~後面加命令,如運行命令:~run

sbt:Hello> ~run
[info] Packaging /home/nescafe/jc-demo/scala/hello/target/scala-2.12/hello_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running example.Hello 
hello
[success] Total time: 0 s, completed Oct 8, 2018 3:51:09 PM
1. Waiting for source changes... (press enter to interrupt)
[info] Compiling 1 Scala source to /home/nescafe/jc-demo/scala/hello/target/scala-2.12/classes ...
[info] Done compiling.
[info] Packaging /home/nescafe/jc-demo/scala/hello/target/scala-2.12/hello_2.12-0.1.0-SNAPSHOT.jar ...
[info] Done packaging.
[info] Running example.Hello 
hello ShenZhen
[success] Total time: 2 s, completed Oct 8, 2018 3:52:40 PM
2. Waiting for source changes... (press enter to interrupt)

通過console的純命令行

在sbt的命令行上輸入console,會進入純命令行模式,也稱REPL,就是Read(取值)--> Evalution(求值)--> Print(打印)--> Loop(循環)。能會快速編譯scala代碼爲字節碼, 然後交給JVM來執行。

計算表達式

計算表達式: 在REPL內, 鍵入scala代碼, 解釋器會直接返回結果給你. 如果你沒有指定變量來存放這個值, 那麼值默認的名稱爲res, 而且會顯示結果的數據類型, 比如Int, Double, java.lang.String等等.
例如:

sbt:Hello> console
[info] Starting scala interpreter...
Welcome to Scala 2.12.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151).
Type in expressions for evaluation. Or try :help.

scala> 1+1
res0: Int = 2

內置變量

內置變量: 在後面可以繼續使用res這個變量, 以及它存放的值.
例如, 2.0 * res0, 返回res1: Double = 4.0
例如, "Hi, " + res0, 返回res2: java.lang.Stirng = Hi, 2

scala> 2.0 * res0
res1: Double = 4.0

scala> "Hi, " + res0
res2: String = Hi, 2

自動補全

自動補全: 在REPL內, 可以使用tab鍵進行自動補全.
例如, 輸入res2.to, 敲擊Tab鍵, 解釋器會顯示一下選項, toCharArray, toLowerCase, toString, toUpperCase. 因爲此時無法判定你需要補全的是哪一個, 因此提供給你所有的選項.
例如, 輸入res2.toU, 敲擊Tab鍵, 直接會給你補全爲res2.toUpperCase

scala> res2.to
to        toBoolean   toByte        toDouble   toIndexedSeq   toIterable   toList   toLowerCase   toSeq   toShort    toString        toUpperCase   
toArray   toBuffer    toCharArray   toFloat    toInt          toIterator   toLong   toMap         toSet   toStream   toTraversable   toVector      
 
scala> res2.toUpperCase
res3: String = HI, 2

輸出hello ShenZhen

nescafe@nescafe-PC:~/jc-demo/scala/hello$ sbt
Picked up _JAVA_OPTIONS:   -Dawt.useSystemAAFontSettings=gasp
[info] Loading project definition from /home/nescafe/jc-demo/scala/hello/project
[info] Loading settings from build.sbt ...
[info] Set current project to Hello (in build file:/home/nescafe/jc-demo/scala/hello/)
[info] sbt server started at local:///home/nescafe/.sbt/1.0/server/0b234651a6ca6d6afea4/sock
sbt:Hello> console
[info] Starting scala interpreter...
Welcome to Scala 2.12.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_151).
Type in expressions for evaluation. Or try :help.

scala> print("hello ShenZhen")
hello ShenZhen
scala> 

以上

學習語法的階段,建議還是從第二種方法開始,因爲第一種帶了sbt工具使用,有點複雜,捨本求末了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章