您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Scala中解釋器、變量及函數(shù)的定義”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
第一步:學(xué)習(xí)使用Scala解釋器
開始Scala最簡(jiǎn)單的方法是使用Scala解釋器,它是一個(gè)編寫Scala表達(dá)式和程序的交互式“shell”。簡(jiǎn)單地在解釋器里輸入一個(gè)表達(dá)式,它將計(jì)算這個(gè)表達(dá)式并打印結(jié)果值。Scala的交互式shell就叫做scala。你可以在命令提示符里輸入scala使用它:
$ scala Welcome to Scala version 2.7.2. Type in expressions to have them evaluated. Type :help for more information. scala>
在你輸入表達(dá)式,如1 + 2,并敲了回車之后:
scala> 1 + 2
解釋器會(huì)打?。?/p>
res0: Int = 3
這行包括:
一個(gè)自動(dòng)產(chǎn)生的或用戶定義的名稱說(shuō)明計(jì)算的值(res0,表示結(jié)果0),
一個(gè)冒號(hào)(:),跟著表達(dá)式的類型(Int),
一個(gè)等號(hào)(=),
計(jì)算表達(dá)式所得到的結(jié)果(3)。
Int類型指代了scala包的類Int。Scala里的包與Java里的包很相似:它們把全局命名空間分區(qū)并提供了信息隱藏的機(jī)制。 類Int的值對(duì)應(yīng)著Java的int值。更廣泛意義上來(lái)說(shuō),所有的Java原始類型在scala包里都有對(duì)應(yīng)的類。例如,scala.Boolean對(duì)應(yīng)著Java的boolean。scala.Float對(duì)應(yīng)著Java的float。當(dāng)你把你的Scala代碼編譯成Java字節(jié)碼,Scala編譯器將使用Java的原始類型以便獲得其帶來(lái)的性能益處。
resX識(shí)別符還將用在后續(xù)的代碼行中。
例如,既然res0已在之前設(shè)為3,res0 * 3就是9:
scala> res0 * 3 res1: Int = 9
打印必要的,卻不僅此而已的,Hello, world! 賀詞,輸入:
scala> println("Hello, world!") Hello, world!
println函數(shù)在標(biāo)準(zhǔn)輸出上打印傳給它的字串,就跟Java里的System.out.println一樣。
第二步:定義一些變量
Scala有兩種變量,val和var。val類似于Java里的final變量。一旦初始化了,val就不能再賦值了。與之對(duì)應(yīng)的,var如同Java里面的非final變量。var可以在它生命周期中被多次賦值。下面是一個(gè)val的定義:
scala> val msg = "Hello, world!" msg: java.lang.String = Hello, world!
這個(gè)語(yǔ)句引入了msg當(dāng)作字串"Hello, world!"的名字。類型是java.lang.String,因?yàn)镾cala的字串是由Java的String類實(shí)現(xiàn)的。
如果你之前曾定義過(guò)Java變量,你會(huì)發(fā)現(xiàn)一個(gè)很醒目的差別:無(wú)論java.lang.String還是String都沒有出現(xiàn)在val的定義中。本例演示了類型推斷:type inference,這種Scala能自動(dòng)理解你省略的類型的能力。在這個(gè)例子里,因?yàn)槟阌靡粋€(gè)字串文本初始化了msg,Scala推斷msg的類型是String。如果Scala解釋器(或編譯器)可以推斷類型,那么讓它這么做而不是寫一些沒必要的顯式類型標(biāo)注常常是***的選擇。不過(guò),如果你愿意,也可以顯式地定義類型,也許有些時(shí)候你也應(yīng)該這么做。顯式的類型標(biāo)注不但可以確保Scala編譯器推斷你傾向的類型,還可以作為將來(lái)代碼讀者有用的文檔。Java中變量的類型指定在其名稱之前,與之不同的是,Scala里變量的類型在其名稱之后,用冒號(hào)分隔。如:
scala> val msg2: java.lang.String = "Hello again, world!" msg2: java.lang.String = Hello again, world!
或者,因?yàn)樵赟cala程序里java.lang類型的簡(jiǎn)化名 也是可見的,所以可以簡(jiǎn)化為:
scala> val msg3: String = "Hello yet again, world!" msg3: String = Hello yet again, world!
回到原來(lái)的那個(gè)msg,現(xiàn)在它定義好了,你可以按你的想法使用它,如:
scala> println(msg) Hello, world!
你對(duì)msg不能做的,因?yàn)槭莢al而不是var,就是再給它賦值。 例如,看看你做如下嘗試的時(shí)候編譯器怎么報(bào)錯(cuò)的:
scala> msg = "Goodbye cruel world!" <console>:5: error: reassignment to val msg = "Goodbye cruel world!" ?
如果可重賦值是你需要的,你應(yīng)使用var,如下:
scala> var greeting = "Hello, world!" greeting: java.lang.String = Hello, world!
由于greeting是var而不是val,你可以在之后對(duì)它重新賦值。比如說(shuō),如果你之后心態(tài)不平了,你可以修改你的greeting為:
scala> greeting = "Leave me alone, world!" greeting: java.lang.String = Leave me alone, world!
要輸入一些能跨越多行的東西,只要一行行輸進(jìn)去就行。如果輸?shù)叫形策€沒結(jié)束,解釋器將在下一行回應(yīng)一個(gè)豎線。
scala> val multiLine = | "This is the next line." multiLine: java.lang.String = This is the next line.
如果你意識(shí)到你輸入了一些錯(cuò)誤的東西,而解釋器仍在等著你更多的輸入,你可以通過(guò)按兩次回車取消掉:
scala> val oops = | | You typed two blank lines. Starting a new command. scala>
本書后續(xù)部分,我們將省略豎線以便讓代碼更易于閱讀(并易于從PDF電子書中復(fù)制粘貼到解釋器里)。
第三步:定義一些函數(shù)
現(xiàn)在你已經(jīng)用過(guò)了Scala的變量,或許想寫點(diǎn)兒函數(shù)。下面是在Scala里面的做法:
scala> def max(x: Int, y: Int): Int = { if (x > y) x else y } max: (Int,Int)Int
函數(shù)的定義用def開始。函數(shù)名,本例中是max,跟著是括號(hào)里帶有冒號(hào)分隔的參數(shù)列表。每個(gè)函數(shù)參數(shù)后面必須帶前綴冒號(hào)的類型標(biāo)注,因?yàn)镾cala編譯器(還有解釋器,但之后我們將只說(shuō)編譯器)沒辦法推斷函數(shù)參數(shù)類型。本例中,名叫max的函數(shù)帶有兩個(gè)參數(shù),x和y,都是Int類型。在max參數(shù)列表的括號(hào)之后你會(huì)看到另一個(gè)“: Int”類型標(biāo)注。這個(gè)東西定義了max函數(shù)的結(jié)果類型:result type。 跟在函數(shù)結(jié)果類型之后的是一個(gè)等號(hào)和一對(duì)包含了函數(shù)體的大括號(hào)。本例中,函數(shù)體里僅有一個(gè)if表達(dá)式,選擇x或者y,哪個(gè)較大,就當(dāng)作max函數(shù)的結(jié)果。就像這里演示的,Scala的if表達(dá)式可以像Java的三元操作符那樣產(chǎn)生一個(gè)值。舉例來(lái)說(shuō),Scala表達(dá)式“if (x > y) x else y”與Java里的“(x > y) ? x : y”表現(xiàn)得很像。在函數(shù)體前的等號(hào)提示我們函數(shù)式編程的世界觀里,函數(shù)定義一個(gè)能產(chǎn)生值的表達(dá)式。函數(shù)的基本結(jié)構(gòu)在圖2.1里面演示。
有時(shí)候Scala編譯器會(huì)需要你定義函數(shù)的結(jié)果類型。比方說(shuō),如果函數(shù)是遞歸的, 你就必須顯式地定義函數(shù)結(jié)果類型。然而在max的例子里,你可以不用寫結(jié)果類型,編譯器也能夠推斷它。 同樣,如果函數(shù)僅由一個(gè)句子組成,你可以可選地不寫大括號(hào)。這樣,你就可以把max函數(shù)寫成這樣:
scala> def max2(x: Int, y: Int) = if (x > y) x else y max2: (Int,Int)Int
一旦你定義了函數(shù),你就可以用它的名字調(diào)用它,如:
scala> max(3, 5) res6: Int = 5
還有既不帶參數(shù)也不返回有用結(jié)果的函數(shù)定義:
scala> def greet() = println("Hello, world!") greet: ()Unit
當(dāng)你定義了greet()函數(shù),解釋器會(huì)回應(yīng)一個(gè)greet: ()Unit。“greet”當(dāng)然是函數(shù)名??瞻椎睦ㄌ?hào)說(shuō)明函數(shù)不帶參數(shù)。Unit是greet的結(jié)果類型。Unit的結(jié)果類型指的是函數(shù)沒有返回有用的值。Scala的Unit類型比較接近Java的void類型,而且實(shí)際上Java里每一個(gè)返回void的方法都被映射為Scala里返回Unit的方法。因此結(jié)果類型為Unit的方法,僅僅是為了它們的副作用而運(yùn)行。在greet()的例子里,副作用是在標(biāo)準(zhǔn)輸出上打印一句客氣的助詞。
下一步,你將把Scala代碼放在一個(gè)文件中并作為腳本執(zhí)行它。如果你想離開解釋器,輸入:quit或者:q。
scala> :quit $
“Scala中解釋器、變量及函數(shù)的定義”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。