1. 程式人生 > >Scala入門到精通——第三十節 Scala指令碼程式設計與結束語

Scala入門到精通——第三十節 Scala指令碼程式設計與結束語

本節主要內容

  1. REPL命令列高階使用
  2. 使用Scala進行Linux指令碼程式設計
  3. 結束語

1. REPL命令列高階使用

在使用REPL命令列時,有時候我們需要貼上的程式碼比較大,而普通的貼上可能會些一些問題,比如中文貼上會出現亂碼、多行程式碼貼上時會出錯,此時需要用到REPL的高階功能。在日常開發過程中,我們貼上多行程式碼的時候會遇到下列問題:

而對於一些長串跨行的程式碼,可能會出現報錯,例如:

那要怎麼辦呢?在REPL命令列中執行下列命令:

先輸入:paste,然後按ctr+v鍵,可以正常貼上內容,中文也不會出現亂碼了:

另外,在實際開發過程中,有些人會認為這種處理方式非常繁瑣,Scala的建立者也為我們考慮過這個問題了,我們也可以在scala IDE for eclipse (在Intellij IDEA 中也有這個功能) 裡面利用REPL命令列,使用方式是建立scala worksheet,建立方式如下: 

1 點選相應的包,然後右鍵,在new選單中選擇 scala worksheet 

2 在檔案中輸入相應的scala語句,worksheet會自動打印出相應的結果 

但是worksheet對中文的支援很不友好,例如下面的程式碼:

worksheet最終得到的中文是亂碼,因此在實際進行語言特性測試的時候儘量避免中文

scala中還有很多我們實際中沒有接觸過的命令,可以用 :help命令檢視REPL現在支援的所有命令:

2. 使用Scala進行Linux指令碼程式設計

本節Linux指令碼內容大部分來源於scala cookbook,部分經過本人修改以在Ubuntu Linux上進行演示。

我們在第一節中提到,Scala不僅僅可以進行大規模分散式應用程式開發(例如Spark記憶體計算框架),也可以進行伺服器端指令碼程式設計即它可以替代Linux中的shell (Bourne Shell, Bash)或其它如 Perl, PHP, Ruby等可用於伺服器端指令碼程式設計的語言。下面給出的是一個簡單示例(前提是要有linux作業系統,本節所有示例都是在ubuntu Linux下執行的):

將上面的內容儲存為hello.sh檔案,然後用下列命令增加其執行許可權:

可以看到我們第一個伺服器指令碼已經執行成功。前面的程式碼中,#!符號表示的是Unix shell指令碼的開始,它會呼叫Unix Bourne shell。exce命令是內建的shell,表示需要執行scala 命令,其中0繫結的是hello.sh指令碼名稱,@ 繫結的是我們輸入的引數。!#表示指令碼宣告頭部的結束。在指令碼中可以使用任何的scala語法,例如:

上述程式碼執行結果:

除此之外,我們還可以定義應用程式物件,可以擴充套件自App,也可以實現自己的Main方法,例如:

下面給出的是不帶引數的執行結果:

下面給出的是帶引數的執行結果,如:

當然,還可以實現自己的main方法,如:

同extends App是一樣的。

如果指令碼中需要應用到第三方庫的話,可以採用下列方式進行包引入:

通過上述程式碼不難發現,指令碼程式設計與一般的Scala應用程式開發有著非常多的相似之處,不同之處僅在於在指令碼程式設計需要加入下面這樣的樣板程式碼

有時候,我們也需要對命令列引數進行捕獲(例如判斷命令列的個數或輸入的引數型別等),然後進行相應的操作,前面已經演示瞭如何列印輸出命令列引數,這裡我們更多實際中可能會遇到的一些經典案例: 
1 判斷輸入引數的個數,不滿足要求則給出提示

執行結果如下:

2 互動式命令列,提示使用者輸入

下面給出的是其執行結果:

3 加速程式碼的執行: 
scala指令碼在執行的過程中,也是通過編譯、執行的步驟來進行的,有時候為加速指令碼的執行,意圖是將編譯後的指令碼儲存下來,在執行時候如果指令碼建立之後沒有發生變化的話,則直接使用以前編譯好的指令碼。實現方式是在指令碼宣告的時候用-savecompiled。

它的原理是在程式碼第一次執行後,生成相應的jar檔案,當下次再執行的便呼叫該jar檔案來執行,第一次執行後生成的jar檔案如下: 

3. 結束語

本節內容是scala入門到精通系列課程的最後一節,通過本課程,我相信可以讓大家成為一箇中級scala語言開發者。Scala語言功能非常強大,其中內容還有很多,還有許多內容我們沒有涉及,例如scala 的GUI程式設計、Scala的定界延續等,但這些功能在實際開發中應用的並不是特別廣泛,特別是Scala GUI程式設計,我們知道java在GUI程式設計方面並不是它的強項,scala語言也是如此。這門課程的目的是讓大家學完之後能夠快速上手spark應用程式開發,希望在學完本課程之後,大家將這門課作為自己學習scala的起點,而非終點。

原文連結