成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

初探Scala編程:編寫腳本,循環(huán)與枚舉

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第二章。Scala是一種針對 JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語言。

本文接著上一節(jié)內(nèi)容,繼續(xù)介紹一些Scala編程的入門知識。

51CTO編輯推薦:Scala編程語言專題

第四步:編寫一些Scala腳本

盡管Scala的設(shè)計目的是幫助程序員建造非常大規(guī)模的系統(tǒng),但它也能很好地縮小到做腳本的規(guī)模。腳本就是一種經(jīng)常會被執(zhí)行的放在文件中的句子序列。把以下代碼放在hello.scala文件中:

  1. println("Hello, world, from a script!") 

然后運行:

  1. $ scala hello.scala 

于是你又會得到另外的祝詞:

  1. Hello, world, from a script! 

通過Scala的名為args的數(shù)組可以獲得傳遞給Scala腳本的命令行參數(shù)。Scala里,數(shù)組以零開始,通過在括號里指定索引訪問一個元素。所以Scala里數(shù)組steps的***個元素是steps(0),不是像Java里的steps[0]。作為測試,輸入以下內(nèi)容到新文件helloarg.scala:

// 向***個參數(shù)打招呼

  1. println("Hello, " + args(0) + "!") 

然后運行:

  1. println("Hello, " + args(0) + "!") 

這條命令里,"planet"被作為命令行參數(shù)傳遞,并在腳本里作為args(0)被訪問。因此,你會看到:

  1. Hello, planet! 

注意這個腳本包括了一條注釋。Scala編譯器將忽略從//開始到行尾截止的以及在/*和*/之間的字符。本例還演示了String使用+操作符的連接。這與你的預(yù)期一樣。表達式"Hello, "+"world!"將產(chǎn)生字符串"Hello, world!"。

第五步:用while循環(huán);用if判斷

要嘗試while,在printargs.scala文件里輸入以下代碼:

  1. var i = 0 
  2. while (i < args.length) {  
  3.   println(args(i))  
  4.   i += 1  

注意

雖然本節(jié)的例子有助于解釋while循環(huán),但它們并未演示***的Scala風(fēng)格。在下一段中,你會看到避免用索引枚舉數(shù)組的更好的手段。

這個腳本開始于變量定義,var i = 0。類型推斷認(rèn)定i的類型是scala.Int,因為這是它的初始值的類型,0。下一行里的while結(jié)構(gòu)使得代碼塊(大括號之間的代碼)重復(fù)執(zhí)行直到布爾表達式i < args.length為假。args.length給出了args數(shù)組的長度。代碼塊包含兩句話,每個都縮進兩個空格,這是Scala的推薦縮進風(fēng)格。***句話,println(args(i)),輸出第i個命令行參數(shù)。第二句話,i += 1,讓i自增一。注意Java的++i和i++在Scala里不起作用,要在Scala里自增,必須寫成要么i = i + 1,或者i += 1。用下列命令運行這個腳本:

  1. $ scala printargs.scala Scala is fun 

你將看到:

  1. Scala  
  2. is  
  3. fun  

想要更好玩兒一些,就把下列代碼輸入到新文件echoargs.scala:

  1. var i = 0 
  2. while (i < args.length) {  
  3.  if (i != 0)  
  4.   print(" ")  
  5.  print(args(i))  
  6.  i += 1  
  7. }  
  8. println()  

在這個版本里,用print調(diào)用替代了println調(diào)用,這樣所有參數(shù)將被輸出在同一行里。為了更好的可閱讀性,你應(yīng)該用if(i != 0)檢查,除了***個之外的每個參數(shù)前插入一個空格。由于***次做while循環(huán)時i != 0會失敗,因此在頭一個參數(shù)之前不會輸出空格。***,你應(yīng)該在末尾多加一個println,這樣在輸出所有參數(shù)之后會有一個換行。這樣你的輸出就非常漂亮了。如果用下面的命令運行腳本:

  1. $ scala echoargs.scala Scala is even more fun  

就能得到:

  1. 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里的分號經(jīng)常是可選的,從而可以釋放你的右小手指。如果你有點兒羅嗦的脾氣,那么就把echoargs.scala腳本寫成下面的樣子好了:

  1. var i = 0;  
  2. while (i < args.length) {  
  3.  if (i != 0) {  
  4.   print(" ");  
  5.  }  
  6.  print(args(i));  
  7.  i += 1;  
  8. }  
  9. println();  

第六步:用foreach和for枚舉

盡管或許你沒意識到,在前一步里寫while循環(huán)的時候,你正在用指令式:imperative風(fēng)格編程。指令式風(fēng)格,是你常常使用像Java,C++和C這些語言里用的風(fēng)格,一次性發(fā)出一個指令式的命令,用循環(huán)去枚舉,并經(jīng)常改變共享在不同函數(shù)之間的狀態(tài)。Scala允許你指令式地編程,但隨著你對Scala的深入了解,你可能常會發(fā)現(xiàn)你自己在用一種更函數(shù)式:functional的風(fēng)格編程。實際上,本書的一個主要目的就是幫助你變得對函數(shù)式風(fēng)格感覺像和指令式風(fēng)格一樣舒適。

函數(shù)式語言的一個主要特征是,函數(shù)是***類結(jié)構(gòu),這在Scala里千真萬確。舉例來說,另一種(簡潔得多)打印每一個命令行參數(shù)的方法是:

  1. args.foreach(arg => println(arg))  

這行代碼中,你在args上調(diào)用foreach方法,并把它傳入函數(shù)。此例中,你傳入了帶有一個叫做arg參數(shù)的函數(shù)文本:function literal。函數(shù)體是println(arg)。如果你把上述代碼輸入到新文件pa.scala,并使用命令執(zhí)行:

  1. $ scala pa.scala Concise is nice  

你會看到:

  1. Concise  
  2. is  
  3. nice  

前例中,Scala解釋器推斷arg的類型是String,因為String是你調(diào)用foreach的那個數(shù)組的元素類型。如果你喜歡更顯式的,你可以加上類型名,不過如此的話你要把參數(shù)部分包裹在括號里(總之這是語法的普通形式):

  1. args.foreach((arg: String) => println(arg))  

運行這個腳本的結(jié)果與前一個相同。

如果你更喜歡簡潔的而不是顯式的風(fēng)格,就可以充分體會到Scala特別簡潔的優(yōu)越性。如果函數(shù)文本由帶一個參數(shù)的一句話組成,你都不需要顯式命名和指定參數(shù)。 這樣,下面的代碼同樣有效:

  1. args.foreach(println)  

總而言之,函數(shù)文本的語法就是,括號里的命名參數(shù)列表,右箭頭,然后是函數(shù)體。語法演示在圖2.2中。

Scala語法演示 

現(xiàn)在,到這里你或許想知道那些你在指令式語言如Java或C里那么信任的for循環(huán)到哪里去了呢。為了努力引導(dǎo)你向函數(shù)式的方向,Scala里只有一個指令式for(稱為for表達式:expression)的函數(shù)式近似。目前你還看不到他們?nèi)康牧α亢捅磉_方式,直到你讀到了(或者先瞄一眼)第7.3節(jié),我們僅僅帶您在這里領(lǐng)略一下。創(chuàng)建一個新文件forargs.scala,輸入以下代碼:

  1. for (arg <- args)  
  2.  println(arg)  

這個表達式里“for”之后的括號包含arg<-args。 <-右側(cè)的是熟悉的args數(shù)組。<-左側(cè)的是“arg”,val的名稱(不是var)。(因為總歸是val,你只要寫arg就可,不要寫成val arg。)盡管arg可能感覺像var,因為他在每次枚舉都會得到新的值,但它的確是val : arg不能在for表達式的函數(shù)體中重新賦值。取而代之,對每個args數(shù)組的元素,一個新的arg val將被創(chuàng)建并初始化為元素值,然后for的函數(shù)體將被執(zhí)行。

如果執(zhí)行forargs.scala腳本:

  1. $ scala forargs.scala for arg in args  

可以看到:

  1. for  
  2. arg  
  3. in  
  4. args  

Scala的for表達式可以比這個做得更多,但是這個例子足以讓你起步了。

本文節(jié)選自《Programming in Scala》

【相關(guān)閱讀】

  1. 初探Scala編程:解釋器,變量及函數(shù)定義
  2. 影響Scala語言設(shè)計的因素列表
  3. 喜歡Scala編程的四個理由
  4. Scala融合面向?qū)ο蠛秃瘮?shù)概念的方法
  5. Scala的語言特性——可伸展的語言
責(zé)任編輯:楊鵬飛 來源: Artima
相關(guān)推薦

2009-07-08 16:52:29

ScalaScala教程

2009-10-30 10:45:45

ScalaEclipseAndroid

2010-09-14 15:34:41

Scala

2013-09-09 09:41:34

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2009-08-24 09:46:40

面向切面編程AOP

2009-10-19 11:26:08

Scala循環(huán)數(shù)組

2010-09-14 13:22:17

Scala編程指南Scala

2010-01-15 09:15:09

Scala Actor并發(fā)

2013-01-11 17:33:46

2009-07-22 07:49:00

Scala控制結(jié)構(gòu)

2009-09-24 09:41:00

Scala講座Scala

2010-10-14 13:50:11

Scala

2023-06-12 15:33:52

Scalafor循環(huán)語句

2010-03-11 10:34:22

Scala

2011-06-28 11:06:16

Scala

2009-09-09 10:50:55

Scala例子Scala與Java

2009-07-09 00:25:00

ScalaSet類Map類

2009-07-09 00:25:00

ScalaListTuple

2009-02-04 17:32:03

ibmdwJavaScala
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久 | 日韩欧美国产成人一区二区 | 99精品国产一区二区青青牛奶 | 久久综合一区 | 日韩精品在线观看一区二区三区 | 日本爱爱视频 | 黄色大片在线播放 | 中文字幕在线免费 | 国产精品一区久久久久 | 国产欧美一区二区在线观看 | 免费一级片 | 婷婷综合五月天 | 亚洲精品免费观看 | 国产伦精品一区二区三区视频金莲 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 成人精品免费视频 | 精品视频一区二区三区 | 日本在线一区二区三区 | 亚洲国产精品一区二区第一页 | 91久久夜色| 国产精品不卡视频 | 黄色大片网站 | 亚洲精品性视频 | 亚洲精品久久久久久久久久久久久 | 国产精品美女 | 日本欧美国产在线 | 一级毛片在线看 | 伊色综合久久之综合久久 | 天天干天天爱天天爽 | 狠狠的操 | 大陆一级毛片免费视频观看 | 欧美成人一区二区 | 国产精品一区二区久久 | 亚欧性视频 | 久久国产综合 | 日韩在线一区二区 | 久久久久久国产精品免费免费狐狸 | 人人做人人澡人人爽欧美 | 久久久久国产一区二区三区 | 色综合国产 | 日韩精品成人在线 |