您好,登錄后才能下訂單哦!
這篇文章主要介紹“怎么編寫Scala腳本實現循環與枚舉”,在日常操作中,相信很多人在怎么編寫Scala腳本實現循環與枚舉問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么編寫Scala腳本實現循環與枚舉”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
第四步:編寫一些Scala腳本
盡管Scala的設計目的是幫助程序員建造非常大規模的系統,但它也能很好地縮小到做腳本的規模。腳本就是一種經常會被執行的放在文件中的句子序列。把以下代碼放在hello.scala文件中:
println("Hello, world, from a script!")
然后運行:
$ scala hello.scala
于是你又會得到另外的祝詞:
Hello, world, from a script!
通過Scala的名為args的數組可以獲得傳遞給Scala腳本的命令行參數。Scala里,數組以零開始,通過在括號里指定索引訪問一個元素。所以Scala里數組steps的***個元素是steps(0),不是像Java里的steps[0]。作為測試,輸入以下內容到新文件helloarg.scala:
// 向***個參數打招呼
println("Hello, " + args(0) + "!")
然后運行:
println("Hello, " + args(0) + "!")
這條命令里,"planet"被作為命令行參數傳遞,并在腳本里作為args(0)被訪問。因此,你會看到:
Hello, planet!
注意這個腳本包括了一條注釋。Scala編譯器將忽略從//開始到行尾截止的以及在/*和*/之間的字符。本例還演示了String使用+操作符的連接。這與你的預期一樣。表達式"Hello, "+"world!"將產生字符串"Hello, world!"。
第五步:用while循環;用if判斷
要嘗試while,在printargs.scala文件里輸入以下代碼:
var i = 0 while (i < args.length) { println(args(i)) i += 1 }
注意
雖然本節的例子有助于解釋while循環,但它們并未演示***的Scala風格。在下一段中,你會看到避免用索引枚舉數組的更好的手段。
這個腳本開始于變量定義,var i = 0。類型推斷認定i的類型是scala.Int,因為這是它的初始值的類型,0。下一行里的while結構使得代碼塊(大括號之間的代碼)重復執行直到布爾表達式i < args.length為假。args.length給出了args數組的長度。代碼塊包含兩句話,每個都縮進兩個空格,這是Scala的推薦縮進風格。***句話,println(args(i)),輸出第i個命令行參數。第二句話,i += 1,讓i自增一。注意Java的++i和i++在Scala里不起作用,要在Scala里自增,必須寫成要么i = i + 1,或者i += 1。用下列命令運行這個腳本:
$ scala printargs.scala Scala is fun
你將看到:
Scala is fun
想要更好玩兒一些,就把下列代碼輸入到新文件echoargs.scala:
var i = 0 while (i < args.length) { if (i != 0) print(" ") print(args(i)) i += 1 } println()
在這個版本里,用print調用替代了println調用,這樣所有參數將被輸出在同一行里。為了更好的可閱讀性,你應該用if(i != 0)檢查,除了***個之外的每個參數前插入一個空格。由于***次做while循環時i != 0會失敗,因此在頭一個參數之前不會輸出空格。***,你應該在末尾多加一個println,這樣在輸出所有參數之后會有一個換行。這樣你的輸出就非常漂亮了。如果用下面的命令運行腳本:
$ scala echoargs.scala Scala is even more fun
就能得到:
Scala is even more fun
注意Scala和Java一樣,必須把while或if的布爾表達式放在括號里。(換句話說,就是不能像在Ruby里面那樣在Scala里這么寫:if i < 10。在Scala里必須寫成if (i < 10)。)另外一點與Java類似的,是如果代碼塊僅有一個句子,大括號就是可選的,就像echoargs.scala里面if句子演示的。并且盡管你沒有看到,Scala也和Java一樣使用分號分隔句子的,只是Scala里的分號經常是可選的,從而可以釋放你的右小手指。如果你有點兒羅嗦的脾氣,那么就把echoargs.scala腳本寫成下面的樣子好了:
var i = 0; while (i < args.length) { if (i != 0) { print(" "); } print(args(i)); i += 1; } println();
第六步:用foreach和for枚舉
盡管或許你沒意識到,在前一步里寫while循環的時候,你正在用指令式:imperative風格編程。指令式風格,是你常常使用像Java,C++和C這些語言里用的風格,一次性發出一個指令式的命令,用循環去枚舉,并經常改變共享在不同函數之間的狀態。Scala允許你指令式地編程,但隨著你對Scala的深入了解,你可能常會發現你自己在用一種更函數式:functional的風格編程。實際上,本書的一個主要目的就是幫助你變得對函數式風格感覺像和指令式風格一樣舒適。
函數式語言的一個主要特征是,函數是***類結構,這在Scala里千真萬確。舉例來說,另一種(簡潔得多)打印每一個命令行參數的方法是:
args.foreach(arg => println(arg))
這行代碼中,你在args上調用foreach方法,并把它傳入函數。此例中,你傳入了帶有一個叫做arg參數的函數文本:function literal。函數體是println(arg)。如果你把上述代碼輸入到新文件pa.scala,并使用命令執行:
$ scala pa.scala Concise is nice
你會看到:
Concise is nice
前例中,Scala解釋器推斷arg的類型是String,因為String是你調用foreach的那個數組的元素類型。如果你喜歡更顯式的,你可以加上類型名,不過如此的話你要把參數部分包裹在括號里(總之這是語法的普通形式):
args.foreach((arg: String) => println(arg))
運行這個腳本的結果與前一個相同。
如果你更喜歡簡潔的而不是顯式的風格,就可以充分體會到Scala特別簡潔的優越性。如果函數文本由帶一個參數的一句話組成,你都不需要顯式命名和指定參數。 這樣,下面的代碼同樣有效:
args.foreach(println)
總而言之,函數文本的語法就是,括號里的命名參數列表,右箭頭,然后是函數體。
現在,到這里你或許想知道那些你在指令式語言如Java或C里那么信任的for循環到哪里去了呢。為了努力引導你向函數式的方向,Scala里只有一個指令式for(稱為for表達式:expression)的函數式近似。目前你還看不到他們全部的力量和表達方式,直到你讀到了(或者先瞄一眼)第7.3節,我們僅僅帶您在這里領略一下。創建一個新文件forargs.scala,輸入以下代碼:
for (arg <- args) println(arg)
這個表達式里“for”之后的括號包含arg<-args。 <-右側的是熟悉的args數組。<-左側的是“arg”,val的名稱(不是var)。(因為總歸是val,你只要寫arg就可,不要寫成val arg。)盡管arg可能感覺像var,因為他在每次枚舉都會得到新的值,但它的確是val : arg不能在for表達式的函數體中重新賦值。取而代之,對每個args數組的元素,一個新的arg val將被創建并初始化為元素值,然后for的函數體將被執行。
如果執行forargs.scala腳本:
$ scala forargs.scala for arg in args
可以看到:
for arg in args
Scala的for表達式可以比這個做得更多,但是這個例子足以讓你起步了。
到此,關于“怎么編寫Scala腳本實現循環與枚舉”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。