摘要:?本節(jié)主要內(nèi)容 REPL命令行高級(jí)使用 使用Scala進(jìn)行Linux腳本編程 結(jié)束語(yǔ) 1. REPL命令行高級(jí)使用 在使用REPL命令行時(shí)征懈,有時(shí)候我們需要粘貼的代碼比較大谋逻,而普通的粘貼可能會(huì)些一些問(wèn)題兔辅,比如中文粘貼會(huì)出現(xiàn)亂碼卜高、多行代碼粘貼時(shí)會(huì)出錯(cuò)占贫,此時(shí)需要用到REPL的高級(jí)功能琅锻。在日常開(kāi)發(fā)過(guò)程中帮掉,我們粘貼多行代碼的時(shí)候會(huì)遇到下列問(wèn)題: //本意是要粘貼下面兩行代碼
本節(jié)主要內(nèi)容
REPL命令行高級(jí)使用
使用Scala進(jìn)行Linux腳本編程
結(jié)束語(yǔ)
1. REPL命令行高級(jí)使用
在使用REPL命令行時(shí)咙俩,有時(shí)候我們需要粘貼的代碼比較大耿戚,而普通的粘貼可能會(huì)些一些問(wèn)題,比如中文粘貼會(huì)出現(xiàn)亂碼阿趁、多行代碼粘貼時(shí)會(huì)出錯(cuò)膜蛔,此時(shí)需要用到REPL的高級(jí)功能。在日常開(kāi)發(fā)過(guò)程中脖阵,我們粘貼多行代碼的時(shí)候會(huì)遇到下列問(wèn)題:
而對(duì)于一些長(zhǎng)串跨行的代碼皂股,可能會(huì)出現(xiàn)報(bào)錯(cuò),例如:
那要怎么辦呢命黔?在REPL命令行中執(zhí)行下列命令:
先輸入:paste呜呐,然后按ctr+v鍵就斤,可以正常粘貼內(nèi)容,中文也不會(huì)出現(xiàn)亂碼了:
另外卵史,在實(shí)際開(kāi)發(fā)過(guò)程中战转,有些人會(huì)認(rèn)為這種處理方式非常繁瑣,Scala的創(chuàng)建者也為我們考慮過(guò)這個(gè)問(wèn)題了以躯,我們也可以在scala IDE for eclipse (在Intellij IDEA 中也有這個(gè)功能) 里面利用REPL命令行槐秧,使用方式是創(chuàng)建scala worksheet,創(chuàng)建方式如下:?
1 點(diǎn)擊相應(yīng)的包忧设,然后右鍵刁标,在new菜單中選擇 scala worksheet?
2 在文件中輸入相應(yīng)的scala語(yǔ)句,worksheet會(huì)自動(dòng)打印出相應(yīng)的結(jié)果?
但是worksheet對(duì)中文的支持很不友好址晕,例如下面的代碼:
worksheet最終得到的中文是亂碼膀懈,因此在實(shí)際進(jìn)行語(yǔ)言特性測(cè)試的時(shí)候盡量避免中文
scala中還有很多我們實(shí)際中沒(méi)有接觸過(guò)的命令,可以用 :help命令查看REPL現(xiàn)在支持的所有命令:
2. 使用Scala進(jìn)行Linux腳本編程
本節(jié)Linux腳本內(nèi)容大部分來(lái)源于scala cookbook谨垃,部分經(jīng)過(guò)本人修改以在Ubuntu Linux上進(jìn)行演示启搂。
我們?cè)诘谝还?jié)中提到,Scala不僅僅可以進(jìn)行大規(guī)模分布式應(yīng)用程序開(kāi)發(fā)(例如Spark內(nèi)存計(jì)算框架)刘陶,也可以進(jìn)行服務(wù)器端腳本編程即它可以替代Linux中的shell (Bourne Shell, Bash)或其它如 Perl, PHP, Ruby等可用于服務(wù)器端腳本編程的語(yǔ)言胳赌。下面給出的是一個(gè)簡(jiǎn)單示例(前提是要有l(wèi)inux操作系統(tǒng),本節(jié)所有示例都是在ubuntu Linux下運(yùn)行的):
將上面的內(nèi)容保存為hello.sh文件匙隔,然后用下列命令增加其執(zhí)行權(quán)限:
可以看到我們第一個(gè)服務(wù)器腳本已經(jīng)運(yùn)行成功疑苫。前面的代碼中,#!符號(hào)表示的是Unix shell腳本的開(kāi)始,它會(huì)調(diào)用Unix Bourne shell纷责。exce命令是內(nèi)置的shell捍掺,表示需要執(zhí)行scala 命令,其中0綁定的是hello.sh腳本名稱再膳,@ 綁定的是我們輸入的參數(shù)挺勿。!#表示腳本聲明頭部的結(jié)束。在腳本中可以使用任何的scala語(yǔ)法喂柒,例如:
上述代碼執(zhí)行結(jié)果:
除此之外满钟,我們還可以定義應(yīng)用程序?qū)ο螅梢詳U(kuò)展自App胳喷,也可以實(shí)現(xiàn)自己的Main方法,例如:
下面給出的是不帶參數(shù)的執(zhí)行結(jié)果:
下面給出的是帶參數(shù)的執(zhí)行結(jié)果夭织,如:
當(dāng)然吭露,還可以實(shí)現(xiàn)自己的main方法,如:
同extends App是一樣的尊惰。
如果腳本中需要應(yīng)用到第三方庫(kù)的話讲竿,可以采用下列方式進(jìn)行包引入:
通過(guò)上述代碼不難發(fā)現(xiàn)泥兰,腳本編程與一般的Scala應(yīng)用程序開(kāi)發(fā)有著非常多的相似之處,不同之處僅在于在腳本編程需要加入下面這樣的樣板代碼
有時(shí)候题禀,我們也需要對(duì)命令行參數(shù)進(jìn)行捕獲(例如判斷命令行的個(gè)數(shù)或輸入的參數(shù)類型等)鞋诗,然后進(jìn)行相應(yīng)的操作,前面已經(jīng)演示了如何打印輸出命令行參數(shù)迈嘹,這里我們更多實(shí)際中可能會(huì)遇到的一些經(jīng)典案例:
1 判斷輸入?yún)?shù)的個(gè)數(shù)削彬,不滿足要求則給出提示
執(zhí)行結(jié)果如下:
2 交互式命令行,提示用戶輸入
下面給出的是其執(zhí)行結(jié)果:
3 加速代碼的執(zhí)行:
scala腳本在執(zhí)行的過(guò)程中秀仲,也是通過(guò)編譯融痛、執(zhí)行的步驟來(lái)進(jìn)行的,有時(shí)候?yàn)榧铀倌_本的執(zhí)行神僵,意圖是將編譯后的腳本保存下來(lái)雁刷,在執(zhí)行時(shí)候如果腳本創(chuàng)建之后沒(méi)有發(fā)生變化的話,則直接使用以前編譯好的腳本保礼。實(shí)現(xiàn)方式是在腳本聲明的時(shí)候用-savecompiled沛励。
它的原理是在代碼第一次執(zhí)行后,生成相應(yīng)的jar文件炮障,當(dāng)下次再執(zhí)行的便調(diào)用該jar文件來(lái)執(zhí)行目派,第一次執(zhí)行后生成的jar文件如下:?
3. 結(jié)束語(yǔ)
本節(jié)內(nèi)容是scala入門(mén)到精通系列課程的最后一節(jié),通過(guò)本課程铝阐,我相信可以讓大家成為一個(gè)中級(jí)scala語(yǔ)言開(kāi)發(fā)者址貌。Scala語(yǔ)言功能非常強(qiáng)大,其中內(nèi)容還有很多徘键,還有許多內(nèi)容我們沒(méi)有涉及练对,例如scala 的GUI編程、Scala的定界延續(xù)等吹害,但這些功能在實(shí)際開(kāi)發(fā)中應(yīng)用的并不是特別廣泛螟凭,特別是Scala GUI編程,我們知道java在GUI編程方面并不是它的強(qiáng)項(xiàng)它呀,scala語(yǔ)言也是如此螺男。這門(mén)課程的目的是讓大家學(xué)完之后能夠快速上手spark應(yīng)用程序開(kāi)發(fā),希望在學(xué)完本課程之后纵穿,大家將這門(mén)課作為自己學(xué)習(xí)scala的起點(diǎn)下隧,而非終點(diǎn)。