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

理解Scala的函數式風格:從var到val的轉變

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

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

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

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

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

  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的辦法把這個代碼變得更函數式風格,例如,像這樣:

  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的一個好處。重構后(更函數式)的代碼比原來(更指令式)的代碼更簡潔,明白,也更少機會犯錯。Scala鼓勵函數式風格的原因,實際上也就是因為函數式風格可以幫助你寫出更易讀懂,更不容易犯錯的代碼。

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

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

代碼 3.9 沒有副作用或var的函數

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

  1. println(formatArgs(args)) 

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

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

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

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

Scala程序員的平衡感

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

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

本文節選自《Programming in Scala》

【相關閱讀】

  1. Scala編程實例:使用Set和Map
  2. Scala編程實例:使用List和Tuple
  3. Scala編程實例:帶類型的參數化數組
  4. 初探Scala編程:編寫腳本,循環與枚舉
  5. 初探Scala編程:解釋器,變量及函數定義
責任編輯:楊鵬飛 來源: Artima
相關推薦

2009-06-09 13:18:56

Scala函數式命令式

2009-07-21 17:16:34

Scala函數式指令式

2009-06-16 17:54:38

Scala類語法語義

2013-04-07 09:40:22

智慧商務都市麗人

2009-12-11 10:44:00

Scala講座函數 scala

2009-02-25 17:14:46

虛擬化綠色環保數據中心

2010-01-28 14:51:24

Scala后函數式

2014-07-11 14:01:29

CFOCFTO甲骨文

2022-03-22 12:56:53

垃圾數據數據完整性

2009-06-16 17:09:17

Scala面向對象函數編程

2015-08-07 09:54:26

升職開發者管理者

2021-05-07 05:54:43

數據庫數據湖數據

2009-08-25 14:47:26

傳統ASP到ASP.N

2010-03-26 11:21:41

Oracle流程管理工作流

2010-03-11 10:34:22

Scala

2011-04-06 15:44:02

SQLNOSQL思維轉變

2009-09-27 15:29:00

Scala講座面向對象Scala

2009-07-08 16:10:24

Scala簡介面向對象函數式

2020-08-10 08:00:19

物聯網云計算技術

2010-04-27 23:56:53

函數式語言鄧草原Scala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 自拍视频一区二区三区 | 国产精品久久久久久久久久免费看 | 91精品欧美久久久久久久 | 欧美精品二区 | 国产精品视频不卡 | 免费成人在线网 | 成人在线观看免费 | 国产三区在线观看视频 | 91在线影院 | 一区二区不卡 | 午夜无码国产理论在线 | 999热视频| 亚洲精品一区在线观看 | 日韩成人免费 | 久久99深爱久久99精品 | 最新日韩精品 | 欧美精品一区二区三区在线播放 | 毛片免费观看视频 | 男女视频在线看 | 国产精品一区二区av | 日韩免费在线视频 | 黄色电影在线免费观看 | 91美女在线 | 久久天堂 | 国产综合一区二区 | 我想看一级黄色毛片 | 在线观看视频一区 | 超碰婷婷 | 亚洲欧美日韩在线不卡 | 久久免费国产 | 一区二区三区国产精品 | 国产精品福利在线观看 | 欧洲妇女成人淫片aaa视频 | 成人一区二区三区在线观看 | 97超碰成人 | 亚洲 日本 欧美 中文幕 | 亚洲精品视频在线观看免费 | 欧美毛片免费观看 | 国产精品一区二区无线 | 亚洲一区二区三区视频免费观看 | 日韩一区中文字幕 |