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

學習Scala的變量范圍

開發 后端
本文節選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第七章。Scala是一種針對 JVM 將函數和面向對象技術組合在一起的編程語言。

現在你已經看過了Scala的內建控制結構,我們將在本節中使用它們來解釋Scala里的范圍是如何起作用的。

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

Scala程序里的變量定義有一個能夠使用的范圍:scope。范圍設定的最普通不過的例子就是,大括號通常引入了一個新的范圍,所以任何定義在打括號里的東西在括號之后就脫離了范圍。這條規則有幾個例外,因為在Scala里有時候你可以用大括號代替小括號。表達式語法的替代品是這種使用大括號例子的其中之一。作為演示,請看一下代碼7.18里展示的函數:

  1. def printMultiTable() {  
  2.   var i = 1 
  3.   // 這里只有i在范圍內  
  4.   while (i <= 10) {  
  5.     var j = 1 
  6.     // 這里i和j在范圍內  
  7.     while (j <= 10) {  
  8.       val prod = (i * j).toString  
  9.       // 這里i,j和prod在范圍內  
  10.       var k = prod.length  
  11.       // 這里i,j,prod和k在范圍內  
  12.       while (k < 4) {  
  13.         print(" ")  
  14.         k += 1 
  15.       }  
  16.       print(prod)  
  17.       j += 1 
  18.     }  
  19.     // i和j仍在范圍內;prod和k脫離范圍  
  20.     println()  
  21.     i += 1 
  22.   }  
  23.   // i仍在范圍內;j,prod和k脫離范圍  
  24. }  
代碼 7.18 打印乘法表時的變量范圍

printMultiTable函數打印了乘法表。 函數的第一個語句引入了變量i并初始化為整數1。然后你可以在函數余下的部分里使用名稱i。

printMultiTable接下去的語句是一個while循環:

  1. while (i <= 10) {  
  2.   var j = 1 
  3.   ...  
  4. }  
你可以在這使用i因為它仍在范圍內。在while循環的第一個語句里,你引入了另一個變量,叫做j,并再次初始化為1。因為變量j定義在while循環的大括號內,所以只能用在while循環里。如果你想嘗試在while循環的大括號之后,在那個說j,prod和k已經出了范圍的注釋后面,再用j做點兒什么事,你的程序就編譯不過了。

本例中定義的所有變量——i,j,prod和k——都是本地變量:local variable。對于它們被定義的函數來說是“本地”的。每次函數被調用的時候,一整套全新的本地變量將被使用。

一旦變量被定義了,你就不可以在同一個范圍內定義同樣的名字。比如,下面的腳本不會被編譯通過:

  1. val a = 1 
  2. val a = 2 // 編譯不過  
  3. println(a)  
然而,你可以在一個內部范圍內定義與外部范圍里名稱相同的變量。下列腳本將編譯通過并可以運行:

  1. val a = 1;  
  2. {  
  3.   val a = 2 // 編譯通過  
  4.   println(a)  
  5. }  
  6. println(a)  
執行時,這個腳本會先打印2,然后打印1,因為定義在內部打括號里的a是不同的變量,將僅在大括號內部有效。另外,本例中在a的第一個定義之后需要加分號,因為Scala的分號推斷機制不會在這里加上分號。Scala和Java間要注意的一個不同是,與Scala不同,Java不允許你在內部范圍內創建與外部范圍變量同名的變量。在Scala程序里,內部變量被說成是遮蔽:shadow了同名的外部變量,因為在內部范圍內外部變量變得不可見了。

或許你已經注意到了一些在解釋器里看上去像是遮蔽的東西:

  1. scala> val a = 1 
  2. a: Int = 1 
  3. scala> val a = 2 
  4. a: Int = 2 
  5. scala> println(a)  
  6. 2 
解釋器里,你可以對你的核心內容重用變量名。撇開別的不說,這樣能允許你當發現你在解釋器里第一次定義變量時犯了錯誤的時候改變主意。你能這么做的理由是因為,在理論上,解釋器在每次你輸入新的語句時都創建了一個新的嵌套范圍。因此,你可以把之前解釋的代碼虛擬化認為是:

  1. val a = 1;  
  2. {  
  3.  var a = 2;  
  4.  {  
  5.   println(a)  
  6.  }  
  7. }  

這段代碼可以像Scala腳本那樣編譯和執行,而且像輸入到解釋器里的代碼那樣,打印輸出2。請記住這樣的代碼對讀者來說是很混亂的,因為在嵌套范圍中變量名稱擁有了新的涵義。通常更好的辦法是選擇一個新的有意義的變量名而不是遮蔽外部變量。

【相關閱讀】

  1. Scala:match表達式、break和continue
  2. 學習Scala:使用try-catch表達式處理異常
  3. Scala中的for表達式:枚舉的“瑞士軍刀”
  4. Scala中的if表達式和while循環
  5. 學習Scala的重載方法和隱式轉換

責任編輯:book05 來源: Artima
相關推薦

2009-11-16 17:04:46

Inside Scal

2009-07-22 07:43:00

Scala閉包

2009-07-08 15:35:18

Case類Scala

2009-07-22 07:57:00

ScalaCurry化函數

2009-09-24 09:28:00

Scala講座全局變量scala

2009-08-03 11:07:18

Scala Actor

2009-07-22 09:22:20

Scala工廠對象

2009-07-03 16:55:33

JSP變量JSP規范

2009-07-22 07:47:00

Scala客戶代碼

2009-07-20 16:56:51

Scala類的定義

2009-07-22 09:02:45

Scala組合繼承

2009-07-08 12:43:59

Scala ServlScala語言

2009-07-21 13:54:55

Scala重載方法隱式轉換

2009-07-21 11:25:03

ScalaRational類

2010-09-14 15:34:41

Scala

2020-10-31 17:33:18

Scala語言函數

2009-07-08 16:52:29

ScalaScala教程

2010-01-14 17:41:57

VB.NET變量范圍

2009-07-22 07:50:00

Scala傳名參數

2009-07-08 09:32:40

ScalaScala與Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男人天堂99 | 一区二区三区网站 | 蜜桃视频在线观看免费视频网站www | 亚洲精品成人在线 | 亚洲国产高清免费 | 国产色| 国产 日韩 欧美 制服 另类 | 在线观看亚洲 | 91精品久久久久久久久 | 国产精品爱久久久久久久 | 一区二区三区高清不卡 | 狠狠操电影 | 欧美一区二区三 | 成人黄色在线 | 伊人网站视频 | 在线激情视频 | 成人污污视频 | 中文字幕欧美在线观看 | 91精品国模一区二区三区 | 天天综合永久 | 精精国产xxxx视频在线 | 激情a| 国产精品久久久久一区二区 | 国产精品一区在线播放 | 久久精品—区二区三区 | 男女那个视频 | 国产亚洲精品美女久久久久久久久久 | 性色综合 | 一区二区三区日韩精品 | 国产精品福利视频 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 欧美成人免费在线视频 | 日本成人一区二区 | 美日韩精品 | 一区二区免费 | 日本淫视频 | 免费久久久| 中文字幕一区在线观看视频 | 精品无码久久久久久久动漫 | 成人不卡视频 | 视频一区在线 |