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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
理解Scala的函數(shù)式風(fēng)格:從var到val的轉(zhuǎn)變

Scala允許你用指令式風(fēng)格編程,但是鼓勵你采用一種更函數(shù)式的風(fēng)格。如果你是從指令式的背景轉(zhuǎn)到Scala來的——例如,如果你是Java程序員——那么學(xué)習(xí)Scala是你有可能面對的主要挑戰(zhàn)就是理解怎樣用函數(shù)式的風(fēng)格編程。我們明白這種轉(zhuǎn)變會很困難,在本書中我們將竭盡所能把你向這方面引導(dǎo)。不過這也需要你這方面的一些工作,我們鼓勵你付出努力。如果你來自于指令式的背景,我們相信學(xué)習(xí)用函數(shù)式風(fēng)格編程將不僅讓你變成更好的Scala程序員,而且還能拓展你的視野并使你變成通常意義上好的程序員。

創(chuàng)新互聯(lián)提供做網(wǎng)站、網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計,成都品牌網(wǎng)站建設(shè),廣告投放平臺等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,10年的網(wǎng)站開發(fā)和建站經(jīng)驗,助力企業(yè)信息化建設(shè),成功案例突破上千余家,是您實現(xiàn)網(wǎng)站建設(shè)的好選擇.

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

通向更函數(shù)式風(fēng)格路上的***步是識別這兩種風(fēng)格在代碼上的差異。其中的一點蛛絲馬跡就是,如果代碼包含了任何var變量,那它大概就是指令式的風(fēng)格。如果代碼根本就沒有var——就是說僅僅包含val——那它大概是函數(shù)式的風(fēng)格。因此向函數(shù)式風(fēng)格推進的一個方式,就是嘗試不用任何var編程。

如果你來自于指令式的背景,如Java,C++,或者C#,你或許認為var是很正統(tǒng)的變量而val是一種特殊類型的變量。相反,如果你來自于函數(shù)式背景,如Haskell,OCamel,或Erlang,你或許認為val是一種正統(tǒng)的變量而var有褻瀆神靈的血統(tǒng)。然而在Scala看來,val和var只不過是你工具箱里兩種不同的工具。它們都很有用,沒有一個天生是魔鬼。Scala鼓勵你學(xué)習(xí)val,但也不會責(zé)怪你對給定的工作選擇最有效的工具。盡管或許你同意這種平衡的哲學(xué),你或許仍然發(fā)現(xiàn)***次理解如何從你的代碼中去掉var是很挑戰(zhàn)的事情。
考慮下面這個改自于第2章的while循環(huán)例子,它使用了var并因此屬于指令式風(fēng)格:

 
 
 
  1. def printArgs(args: Array[String]): Unit = {
  2.  var i = 0
  3.  while (i < args.length) {
  4.   println(args(i))
  5.   i += 1
  6.  }
  7. }

你可以通過去掉var的辦法把這個代碼變得更函數(shù)式風(fēng)格,例如,像這樣:

 
 
 
  1. def printArgs(args: Array[String]): Unit = {
  2.  for (arg <- args)
  3.   println(arg)
  4. }

或這樣:

 
 
 
  1. def printArgs(args: Array[String]): Unit = {
  2.  args.foreach(println)
  3. }

這個例子演示了減少使用var的一個好處。重構(gòu)后(更函數(shù)式)的代碼比原來(更指令式)的代碼更簡潔,明白,也更少機會犯錯。Scala鼓勵函數(shù)式風(fēng)格的原因,實際上也就是因為函數(shù)式風(fēng)格可以幫助你寫出更易讀懂,更不容易犯錯的代碼。

當(dāng)然,你可以走得更遠。重構(gòu)后的printArgs方法并不是純函數(shù)式的,因為它有副作用——本例中,其副作用是打印到標(biāo)準(zhǔn)輸出流。函數(shù)有副作用的馬腳就是結(jié)果類型為Unit。如果某個函數(shù)不返回任何有用的值,就是說其結(jié)果類型為Unit,那么那個函數(shù)***能讓世界有點兒變化的辦法就是通過某種副作用。更函數(shù)式的方式應(yīng)該是定義對需打印的arg進行格式化的方法,但是僅返回格式化之后的字串,如代碼3.9所示:

 
 
 
  1. def formatArgs(args: Array[String]) = args.mkString("\n")

代碼 3.9 沒有副作用或var的函數(shù)

現(xiàn)在才是真正函數(shù)式風(fēng)格的了:滿眼看不到副作用或者var。能在任何可枚舉的集合類型(包括數(shù)組,列表,集和映射)上調(diào)用的mkString方法,返回由每個數(shù)組元素調(diào)用toString產(chǎn)生結(jié)果組成的字串,以傳入字串間隔。因此如果args包含了三個元素,"zero","one"和"two",formatArgs將返回"zero\none\ntwo"。當(dāng)然,這個函數(shù)并不像printArgs方法那樣實際打印輸出,但可以簡單地把它的結(jié)果傳遞給println來實現(xiàn):

 
 
 
  1. println(formatArgs(args))

每個有用的程序都可能有某種形式的副作用,因為否則就不可能對外部世界提供什么值。偏好于無副作用的方法可以鼓勵你設(shè)計副作用代碼最少化了的程序。這種方式的好處之一是可以有助于使你的程序更容易測試。舉例來說,要測試本節(jié)之前給出三段printArgs方法的任一個,你將需要重定義println,捕獲傳遞給它的輸出,并確信這是你希望的。相反,你可以通過檢查結(jié)果來測試formatArgs:

 
 
 
  1. val res = formatArgs(Array("zero", "one", "two"))
  2. assert(res == "zero\none\ntwo")

Scala的assert方法檢查傳入的Boolean并且如果是假,拋出AssertionError。如果傳入的Boolean是真,assert只是靜靜地返回。你將在第十四章學(xué)習(xí)更多關(guān)于斷言和測試的東西。

雖如此說,不過請牢記在心:不管是var還是副作用都不是天生邪惡的。Scala不是強迫你用函數(shù)式風(fēng)格編任何東西的純函數(shù)式語言。它是一種指令式/函數(shù)式混合的語言。你或許發(fā)現(xiàn)在某些情況下指令式風(fēng)格更符合你手中的問題,在這時候你不應(yīng)該對使用它猶豫不決。

Scala程序員的平衡感

崇尚val,不可變對象和沒有副作用的方法。

首先想到它們。只有在特定需要和判斷之后才選擇var,可變對象和有副作用的方法。

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

【相關(guān)閱讀】

  1. Scala編程實例:使用Set和Map
  2. Scala編程實例:使用List和Tuple
  3. Scala編程實例:帶類型的參數(shù)化數(shù)組
  4. 初探Scala編程:編寫腳本,循環(huán)與枚舉
  5. 初探Scala編程:解釋器,變量及函數(shù)定義

本文名稱:理解Scala的函數(shù)式風(fēng)格:從var到val的轉(zhuǎn)變
當(dāng)前路徑:http://www.dlmjj.cn/article/dhjjjcj.html