日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
初探Scala編程:解釋器,變量及函數(shù)定義

在我們開始深度Scala教程之前,我們將用兩章來給你畫一張Scala大致的圖紙,更重要的是,帶你寫一些代碼。我們鼓勵你實際嘗試所有出現(xiàn)在本章以及后續(xù)章節(jié)中的代碼例子。開始學(xué)習(xí)Scala***的方法就是用它編程。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、克拉瑪依網(wǎng)站維護、網(wǎng)站推廣。

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

要執(zhí)行本章的例子,你應(yīng)該有一份標(biāo)準(zhǔn)的Scala安裝。想要的話,可以到http://www.scala-lang.org/downloads并依照你的平臺的向?qū)АD阋部梢允褂肊clipse,IntelliJ,或NetBeans的Scala插件,但是對于本章的這幾步來說,我們假設(shè)你用的是從scala-lang.org拿到的Scala發(fā)布包。

***步:學(xué)習(xí)使用Scala解釋器

開始Scala最簡單的方法是使用Scala解釋器,它是一個編寫Scala表達式和程序的交互式“shell”。簡單地在解釋器里輸入一個表達式,它將計算這個表達式并打印結(jié)果值。Scala的交互式shell就叫做scala。你可以在命令提示符里輸入scala使用它:

 
 
 
 
  1. $ scala
  2. Welcome to Scala version 2.7.2.
  3. Type in expressions to have them evaluated.
  4. Type :help for more information.
  5. scala>

在你輸入表達式,如1 + 2,并敲了回車之后:

 
 
 
 
  1. scala> 1 + 2

解釋器會打?。?/p>

 
 
 
 
  1. res0: Int = 3

這行包括:

一個自動產(chǎn)生的或用戶定義的名稱說明計算的值(res0,表示結(jié)果0),

一個冒號(:),跟著表達式的類型(Int),

一個等號(=),

計算表達式所得到的結(jié)果(3)。

Int類型指代了scala包的類Int。Scala里的包與Java里的包很相似:它們把全局命名空間分區(qū)并提供了信息隱藏的機制。 類Int的值對應(yīng)著Java的int值。更廣泛意義上來說,所有的Java原始類型在scala包里都有對應(yīng)的類。例如,scala.Boolean對應(yīng)著Java的boolean。scala.Float對應(yīng)著Java的float。當(dāng)你把你的Scala代碼編譯成Java字節(jié)碼,Scala編譯器將使用Java的原始類型以便獲得其帶來的性能益處。

resX識別符還將用在后續(xù)的代碼行中。

例如,既然res0已在之前設(shè)為3,res0 * 3就是9:

 
 
 
 
  1. scala> res0 * 3
  2. res1: Int = 9

打印必要的,卻不僅此而已的,Hello, world! 賀詞,輸入:

 
 
 
 
  1. scala> println("Hello, world!")
  2. Hello, world!

println函數(shù)在標(biāo)準(zhǔn)輸出上打印傳給它的字串,就跟Java里的System.out.println一樣。

第二步:定義一些變量

Scala有兩種變量,val和var。val類似于Java里的final變量。一旦初始化了,val就不能再賦值了。與之對應(yīng)的,var如同Java里面的非final變量。var可以在它生命周期中被多次賦值。下面是一個val的定義:

 
 
 
 
  1. scala> val msg = "Hello, world!"
  2. msg: java.lang.String = Hello, world!

這個語句引入了msg當(dāng)作字串"Hello, world!"的名字。類型是java.lang.String,因為Scala的字串是由Java的String類實現(xiàn)的。

如果你之前曾定義過Java變量,你會發(fā)現(xiàn)一個很醒目的差別:無論java.lang.String還是String都沒有出現(xiàn)在val的定義中。本例演示了類型推斷:type inference,這種Scala能自動理解你省略的類型的能力。在這個例子里,因為你用一個字串文本初始化了msg,Scala推斷msg的類型是String。如果Scala解釋器(或編譯器)可以推斷類型,那么讓它這么做而不是寫一些沒必要的顯式類型標(biāo)注常常是***的選擇。不過,如果你愿意,也可以顯式地定義類型,也許有些時候你也應(yīng)該這么做。顯式的類型標(biāo)注不但可以確保Scala編譯器推斷你傾向的類型,還可以作為將來代碼讀者有用的文檔。Java中變量的類型指定在其名稱之前,與之不同的是,Scala里變量的類型在其名稱之后,用冒號分隔。如:

 
 
 
 
  1. scala> val msg2: java.lang.String = "Hello again, world!"
  2. msg2: java.lang.String = Hello again, world!

或者,因為在Scala程序里java.lang類型的簡化名 也是可見的,所以可以簡化為:

 
 
 
 
  1. scala> val msg3: String = "Hello yet again, world!"
  2. msg3: String = Hello yet again, world!

回到原來的那個msg,現(xiàn)在它定義好了,你可以按你的想法使用它,如:

 
 
 
 
  1. scala> println(msg)
  2. Hello, world!

你對msg不能做的,因為是val而不是var,就是再給它賦值。 例如,看看你做如下嘗試的時候編譯器怎么報錯的:

 
 
 
 
  1. scala> msg = "Goodbye cruel world!"
  2. :5: error: reassignment to val
  3.          msg = "Goodbye cruel world!"
  4.               ?

如果可重賦值是你需要的,你應(yīng)使用var,如下:

 
 
 
 
  1. scala> var greeting = "Hello, world!"
  2. greeting: java.lang.String = Hello, world!

由于greeting是var而不是val,你可以在之后對它重新賦值。比如說,如果你之后心態(tài)不平了,你可以修改你的greeting為:

 
 
 
 
  1. scala> greeting = "Leave me alone, world!"
  2. greeting: java.lang.String = Leave me alone, world!

要輸入一些能跨越多行的東西,只要一行行輸進去就行。如果輸?shù)叫形策€沒結(jié)束,解釋器將在下一行回應(yīng)一個豎線。

 
 
 
 
  1. scala> val multiLine =
  2.       | "This is the next line."
  3. multiLine: java.lang.String = This is the next line.

如果你意識到你輸入了一些錯誤的東西,而解釋器仍在等著你更多的輸入,你可以通過按兩次回車取消掉:

 
 
 
 
  1. scala> val oops =
  2.       |
  3.       |
  4. You typed two blank lines. Starting a new command.
  5. scala>

本書后續(xù)部分,我們將省略豎線以便讓代碼更易于閱讀(并易于從PDF電子書中復(fù)制粘貼到解釋器里)。

第三步:定義一些函數(shù)

現(xiàn)在你已經(jīng)用過了Scala的變量,或許想寫點兒函數(shù)。下面是在Scala里面的做法:

 
 
 
 
  1. scala> def max(x: Int, y: Int): Int = {
  2.      if (x > y) x
  3.      else y
  4.     }
  5. max: (Int,Int)Int

函數(shù)的定義用def開始。函數(shù)名,本例中是max,跟著是括號里帶有冒號分隔的參數(shù)列表。每個函數(shù)參數(shù)后面必須帶前綴冒號的類型標(biāo)注,因為Scala編譯器(還有解釋器,但之后我們將只說編譯器)沒辦法推斷函數(shù)參數(shù)類型。本例中,名叫max的函數(shù)帶有兩個參數(shù),x和y,都是Int類型。在max參數(shù)列表的括號之后你會看到另一個“: Int”類型標(biāo)注。這個東西定義了max函數(shù)的結(jié)果類型:result type。 跟在函數(shù)結(jié)果類型之后的是一個等號和一對包含了函數(shù)體的大括號。本例中,函數(shù)體里僅有一個if表達式,選擇x或者y,哪個較大,就當(dāng)作max函數(shù)的結(jié)果。就像這里演示的,Scala的if表達式可以像Java的三元操作符那樣產(chǎn)生一個值。舉例來說,Scala表達式“if (x > y) x else y”與Java里的“(x > y) ? x : y”表現(xiàn)得很像。在函數(shù)體前的等號提示我們函數(shù)式編程的世界觀里,函數(shù)定義一個能產(chǎn)生值的表達式。函數(shù)的基本結(jié)構(gòu)在圖2.1里面演示。

有時候Scala編譯器會需要你定義函數(shù)的結(jié)果類型。比方說,如果函數(shù)是遞歸的, 你就必須顯式地定義函數(shù)結(jié)果類型。然而在max的例子里,你可以不用寫結(jié)果類型,編譯器也能夠推斷它。 同樣,如果函數(shù)僅由一個句子組成,你可以可選地不寫大括號。這樣,你就可以把max函數(shù)寫成這樣:

 
 
 
 
  1. scala> def max2(x: Int, y: Int) = if (x > y) x else y
  2. max2: (Int,Int)Int

一旦你定義了函數(shù),你就可以用它的名字調(diào)用它,如:

 
 
 
 
  1. scala> max(3, 5)
  2. res6: Int = 5

還有既不帶參數(shù)也不返回有用結(jié)果的函數(shù)定義:

 
 
 
 
  1. scala> def greet() = println("Hello, world!")
  2. greet: ()Unit

當(dāng)你定義了greet()函數(shù),解釋器會回應(yīng)一個greet: ()Unit。“greet”當(dāng)然是函數(shù)名??瞻椎睦ㄌ栒f明函數(shù)不帶參數(shù)。Unit是greet的結(jié)果類型。Unit的結(jié)果類型指的是函數(shù)沒有返回有用的值。Scala的Unit類型比較接近Java的void類型,而且實際上Java里每一個返回void的方法都被映射為Scala里返回Unit的方法。因此結(jié)果類型為Unit的方法,僅僅是為了它們的副作用而運行。在greet()的例子里,副作用是在標(biāo)準(zhǔn)輸出上打印一句客氣的助詞。

下一步,你將把Scala代碼放在一個文件中并作為腳本執(zhí)行它。如果你想離開解釋器,輸入:quit或者:q。

  
  
  
  
  1. scala> :quit
  2. $

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

【相關(guān)閱讀】

  1. 影響Scala語言設(shè)計的因素列表
  2. 喜歡Scala編程的四個理由
  3. Scala融合面向?qū)ο蠛秃瘮?shù)概念的方法
  4. Scala的語言特性——可伸展的語言
  5. 學(xué)習(xí)Scala中的Case類

網(wǎng)頁標(biāo)題:初探Scala編程:解釋器,變量及函數(shù)定義
URL標(biāo)題:http://www.dlmjj.cn/article/ccdggeo.html