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

Scala編程實例:帶類型的參數(shù)化數(shù)組

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

Scala里可以使用new實例化對象或類實例。當你在Scala里實例化對象,可以使用值和類型把它參數(shù)化:parameterize。參數(shù)化的意思是在你創(chuàng)建實例的時候“設置”它。通過把加在括號里的對象傳遞給實例的構(gòu)造器的方式來用值參數(shù)化實例。

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

例如,下面的Scala代碼實例化一個新的java.math.BigInteger并使用值"12345"參數(shù)化:

  1. val big = new java.math.BigInteger("12345") 

通過在方括號里設定一個或更多類型來參數(shù)化實例。代碼3.1里展示了一個例子。在這個例子中,greetStrings是類型Array[String](字串數(shù)組)的值,并被第一行代碼里的值3參數(shù)化,使它的初始長度為3。如果把代碼3.1里的代碼作為腳本執(zhí)行,你會看到另一個Hello, world!的祝詞。請注意當你同時用類型和值去參數(shù)化實例的時候,類型首先在方括號中出現(xiàn),然后跟著值在圓括號中。

  1. val greetStrings = new Array[String](3)  
  2. greetStrings(0) = "Hello"  
  3. greetStrings(1) = ", "  
  4. greetStrings(2) = "world!\n"  
  5. for (i <- 0 to 2)  
  6.  print(greetStrings(i))  

代碼 3.1 用類型參數(shù)化數(shù)組

注意

盡管代碼3.1里的代碼演示了一些重要的概念,但它沒有展示Scala里創(chuàng)建和初始化數(shù)組的推薦方式。你會在代碼3.2中看到更好的方式。

如果想用一種更顯式的方式,你可以顯式定義greetStrings的類型:

  1. val greetStrings: Array[String] = new Array[String](3)  

由于Scala有類型推斷,這行代碼與代碼3.1里的第一行代碼語義一致。不過這種形式說明了類型參數(shù)化部分(方括號里的類型名)形成了實例類型的部分,而值參數(shù)化部分(圓括號里的值)不是。greetStrings的類型是Array[String],不是Array[String](3)。

代碼3.1的下三行代碼初始化了greetStrings數(shù)組的每個元素:

  1. greetStrings(0) = "Hello"  
  2. greetStrings(1) = ", "  
  3. greetStrings(2) = "world!\n"  

正如前面提到的,Scala里的數(shù)組是通過把索引放在圓括號里面訪問的,而不是像Java那樣放在方括號里。所以數(shù)組的第零個元素是greetStrings(0),不是greetStrings[0]。

這三行代碼演示了搞明白Scala如何看待val的意義的重要概念。當你用val定義一個變量,那么這個變量就不能重新賦值,但它指向的對象卻仍可以暗自改變。所以在本例中,你不能把greetStrings重新賦值成不同的數(shù)組;greetStrings將永遠指向那個它被初始化時候指向的同一個Array[String]實例。但是你能一遍遍修改那個Array[String]的元素,因此數(shù)組本身是可變的。

代碼3.1的最后兩行包含一個for表達式用來依次輸出每個greetStrings數(shù)組元素。

  1. for (i <- 0 to 2)  
  2.  print(greetStrings(i))  

這個for表達式的第一行代碼演示了Scala的另一個通用規(guī)則:如果方法僅帶一個參數(shù),你可以不帶點或括號的調(diào)用它。本例中的to實際上是帶一個Int參數(shù)的方法。代碼0 to 2被轉(zhuǎn)換成方法調(diào)用(0).to(2)。 請注意這個語法僅在你顯示指定方法調(diào)用的接受者時才起作用。不可以寫 pringln 10,但是可以寫成“Console println 10”。

從技術上講,Scala沒有操作符重載,因為它根本沒有傳統(tǒng)意義上的操作符。取而代之的是,諸如+,-,*和/這樣的字符可以用來做方法名。因此,當?shù)谝徊嚼锬阍赟cala解釋器里輸入1 + 2,你實際上正在Int對象1上調(diào)用一個名為+的方法,并把2當作參數(shù)傳給它。如圖3.1所示,你也可以使用傳統(tǒng)的方法調(diào)用語法把1 + 2替代寫成(1).+(2)。

Scala里所有的操作符都是方法調(diào)用 

這里演示的另一重要思想可以讓你看到為什么數(shù)組在Scala里是用括號訪問的。與Java比Scala很少有特例。數(shù)組和Scala里其他的類一樣只是類的實現(xiàn)。當你在一個或多個值或變量外使用括號時,Scala會把它轉(zhuǎn)換成對名為apply的方法調(diào)用。于是greetStrings(i)轉(zhuǎn)換成greetStrings.apply(i)。所以Scala里訪問數(shù)組的元素也只不過是跟其它的一樣的方法調(diào)用。這個原則不僅僅局限于數(shù)組:任何對某些在括號中的參數(shù)的對象的應用將都被轉(zhuǎn)換為對apply方法的調(diào)用。當然前提是這個類型實際定義過apply方法。所以這不是一個特例,而是一個通則。

與之相似的是,當對帶有括號并包括一到若干參數(shù)的變量賦值時,編譯器將把它轉(zhuǎn)化為對帶有括號里參數(shù)和等號右邊的對象的update方法的調(diào)用。

例如,

  1. greetStrings(0) = "Hello"  

將被轉(zhuǎn)化為

  1. greetStrings.update(0, "Hello")  

因此,下列Scala代碼與你在代碼3.1里的代碼語義一致:

  1. val greetStrings = new Array[String](3)  
  2. greetStrings.update(0, "Hello")  
  3. greetStrings.update(1, ", ")  
  4. greetStrings.update(2, "world!\n")  
  5. for (i <- 0.to(2))  
  6.   print(greetStrings.apply(i))  

Scala在對待任何事上追求概念的簡潔性,從數(shù)組到表達式,包括帶有方法的對象。你不必記住太多特例,如Java里原始類型和相應的包裝類間的,或者數(shù)組和正常的對象間的差別。而且這種統(tǒng)一并未損害重要的性能代價。Scala編譯器使用Java數(shù)組,原始類型,及可存在于編譯完成代碼里的原生數(shù)學類型。

盡管目前為止在這一步里你看到的例子編譯運行良好,Scala提供了通常可以用在你真實代碼里的更簡潔的方法創(chuàng)造和初始化數(shù)組。它看起來就像展示在代碼3.2中的樣子。這行代碼創(chuàng)建了長度為3的新數(shù)組,用傳入的字串"zero","one"和"two"初始化。編譯器推斷數(shù)組的類型是Array[String] ,因為你把字串傳給它。

  1. val numNames = Array("zero", "one", "two") 

代碼 3.2 創(chuàng)造和初始化數(shù)組

你在代碼3.2里實際做的就是調(diào)用了一個叫做apply的工廠方法,從而創(chuàng)造并返回了新的數(shù)組。apply方法帶可變數(shù)量個參數(shù) ,被定義在Array的伴生對象:companion object上。你會在4.3節(jié)里學到更多關于伴生對象的東西。如果你是一個Java程序員,你可以認為這個就像在Array類上調(diào)用一個叫做apply的靜態(tài)方法。更羅嗦的調(diào)用同樣的apply方法的辦法是:

  1. val numNames2 = Array.apply("zero", "one", "two")    

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

【相關閱讀】

  1. 初探Scala編程:編寫腳本,循環(huán)與枚舉
  2. 初探Scala編程:解釋器,變量及函數(shù)定義
  3. 影響Scala語言設計的因素列表
  4. 喜歡Scala編程的四個理由
  5. Scala融合面向?qū)ο蠛秃瘮?shù)概念的方法
責任編輯:楊鵬飛 來源: Artima
相關推薦

2009-07-09 00:25:00

ScalaSet類Map類

2009-07-09 00:25:00

ScalaListTuple

2009-07-21 09:31:00

Scala基本類型文本

2010-09-14 15:34:41

Scala

2014-08-11 16:41:05

Android傳感器

2022-09-27 11:01:08

Python裝飾器

2009-07-22 07:43:00

Scala重復參數(shù)

2011-08-23 13:14:05

JDBC帶輸出參數(shù)的存儲過程

2009-10-19 11:26:08

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

2010-11-17 11:31:22

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

2009-09-24 09:41:00

Scala講座Scala

2009-08-13 10:35:05

Scala數(shù)組排序

2009-09-18 11:44:05

Scala實例教程Kestrel

2009-07-08 16:25:15

Scala的特點類型推斷

2009-07-22 08:34:47

Scala方法和字段

2010-09-14 13:22:17

Scala編程指南Scala

2009-07-22 07:57:00

ScalaCurry化函數(shù)

2009-07-22 09:43:30

Scala類型

2009-06-10 09:29:40

Scala類型通配符

2009-08-28 11:09:35

C#數(shù)組初始化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线午夜 | 涩爱av一区二区三区 | 日韩在线视频一区 | 日韩在线成人 | 久久久久久久国产精品 | 久久精品亚洲国产 | 91精品国产综合久久久久 | www.五月天婷婷 | 日韩中文字幕免费在线 | 热久久国产 | av色在线 | 色狠狠一区 | 日韩中文字幕av | 成人在线 | 伊人网综合在线观看 | 色男人的天堂 | 欧美日韩精品影院 | 色天天综合 | 欧美精品国产一区二区 | 国产亚洲网站 | 九九九国产 | 日本不卡免费新一二三区 | 欧美女优在线观看 | 91精品在线观看入口 | 国产精品久久久久久婷婷天堂 | 视频在线观看一区二区 | 成人在线一区二区 | 久久久久久久久久久久久9999 | 免费观看av网站 | 天天操 天天操 | 精品国产伦一区二区三区观看说明 | 午夜影院在线观看免费 | 国产视频第一页 | 日韩av成人在线观看 | 国产一区二区三区 | 香蕉婷婷 | 久久久123 | 欧美日本韩国一区二区 | 中文字幕日韩一区二区 | 欧美成人精品在线 | 日韩乱码在线 |