自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Scala中定義無參數(shù)方法

開發(fā) 后端
本文節(jié)選自Martin Odersky,Lex Spoon和Bill Venners所著,Regular翻譯的《Programming in Scala》的第十章。Scala是一種針對 JVM 將函數(shù)和面向?qū)ο蠹夹g(shù)組合在一起的編程語言。

作為下一步,我們將向Element添加顯示寬度和高度的方法,展示在代碼10.2中。height方法返回contents里的行數(shù)。width方法返回***行的長度,或如果元素沒有行記錄,返回零。(也就是說你不能定義一個高度為零但寬度不為零的元素。)

  1. abstract class Element {  
  2.  def contents: Array[String]  
  3.  def height: Int = contents.length  
  4.  def width: Int = if (height == 00 else contents(0).length  
  5. }  

代碼 10.2 定義無參數(shù)方法width和height

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

請注意Element的三個方法沒一個有參數(shù)列表,甚至連個空列表都沒有。例如,代之以:

  1. def width(): Int  
方法定義了不加括號的:

  1. def width: Int  
這種無參數(shù)方法在Scala里是非常普通的。相對的,帶有空括號的方法定義,如def height(): Int,被稱為空括號方法:empty-paren method。推薦的慣例是在沒有參數(shù)并且方法僅通過讀含有對象的方式訪問可變狀態(tài)(專指其不改變可變狀態(tài))時(shí),使用無參數(shù)方法。這個慣例支持統(tǒng)一訪問原則:uniform access principle,Meyer,面向?qū)ο筌浖?gòu)造【Mey00】就是說客戶代碼不應(yīng)受通過字段還是方法實(shí)現(xiàn)屬性的決定的影響。例如,我們可以選擇把width和height作為字段而不是方法來實(shí)現(xiàn),只要簡單地在每個實(shí)現(xiàn)里把def修改成val即可:

  1. abstract class Element {  
  2.  def contents: Array[String]  
  3.  val height = contents.length  
  4.  val width =  
  5.   if (height == 00 else contents(0).length  
  6. }  
兩組定義從客戶的觀點(diǎn)來看是完全相同的。唯一的差別是與的訪問或許稍微比方法調(diào)用要快,因?yàn)樽侄沃翟陬惐怀跏蓟臅r(shí)候被預(yù)計(jì)算,而方法調(diào)用在每次調(diào)用的時(shí)候都要計(jì)算。換句話說,字段在每個Element對象上需要更多的內(nèi)存空間。因此類的使用概況,屬性表達(dá)成字段還是方法更好,決定了其實(shí)現(xiàn),并且這個概況還可以隨時(shí)改變。重點(diǎn)是Element類的客戶不應(yīng)在其內(nèi)部實(shí)現(xiàn)改變的時(shí)候受影響。

特別是如果類的字段變成了訪問函數(shù),且訪問函數(shù)是純的,就是說它沒有副作用并且不依賴于可變狀態(tài),那么類Element的客戶不需要被重寫??蛻舳疾粦?yīng)該需要關(guān)心這些。

目前為止一切良好。但仍然有些瑣碎的復(fù)雜的東西要去做以協(xié)同Java處理事情的方式。問題在于Java沒有實(shí)現(xiàn)統(tǒng)一訪問原則。因此Java里是string.length(),不是string.length(盡管是array.length,不是array.length())。不用說,這讓人很困惑。

為了在這道缺口上架一座橋梁,Scala在遇到混合了無參數(shù)和空括號方法的情況時(shí)很大度。特別是,你可以用空括號方法重載無參數(shù)方法,并且反之亦可。你還可以在調(diào)用任何不帶參數(shù)的方法時(shí)省略空的括號。例如,下面兩行在Scala里都是合法的:

  1. Array(123).toString  
  2. "abc".length  
原則上Scala的函數(shù)調(diào)用中可以省略所有的空括號。然而,在調(diào)用的方法表達(dá)的超過其接收調(diào)用者對象的屬性時(shí),推薦仍然寫一對空的括號。例如,如果方法執(zhí)行了I/O,或?qū)懭肟芍匦沦x值的變量(var),或讀出不是接受調(diào)用者的字段的var,無論是直接的還是非直接的通過使用可變對象,那么空括號是合適的。這種方式是讓參數(shù)列表扮演一個可見的線索說明某些有趣的計(jì)算正通過調(diào)用被觸發(fā)。例如:

  1. "hello".length // 沒有副作用,所以無須()  
  2. println() // ***別省略()  

總結(jié)起來,Scala里定義不帶參數(shù)也沒有副作用的方法為無參數(shù)方法,也就是說,省略空的括號,是鼓勵的風(fēng)格。另一方面,永遠(yuǎn)不要定義沒有括號的帶副作用的方法,因?yàn)槟菢拥脑挿椒ㄕ{(diào)用看上去會像選擇一個字段。這樣你的客戶看到了副作用會很奇怪。相同地,當(dāng)你調(diào)用帶副作用的函數(shù),請確信寫這個調(diào)用的時(shí)候包括了空的括號。另一種考慮這個問題的方式是,如果你調(diào)用的函數(shù)執(zhí)行了操作,使用括號,但如果僅提供了對某個屬性的訪問,省略括號。

【相關(guān)閱讀】

  1. 學(xué)習(xí)Scala的二維布局庫和抽象類
  2. Scala學(xué)習(xí):叫名參數(shù)by-name parameter
  3. Scala:如何編寫新的控制結(jié)構(gòu)
  4. Scala學(xué)習(xí):Curry化的函數(shù)
  5. Scala學(xué)習(xí):簡化客戶代碼

責(zé)任編輯:book05 來源: Artima
相關(guān)推薦

2009-07-22 08:57:49

Scalafinal

2009-07-21 17:21:57

Scala定義函數(shù)

2009-07-22 08:34:47

Scala方法和字段

2009-09-09 11:28:40

Scala類

2009-07-20 16:56:51

Scala類的定義

2024-01-17 06:23:35

SwiftTypeScript定義函數(shù)

2009-07-22 07:43:00

Scala重復(fù)參數(shù)

2009-11-16 17:04:46

Inside Scal

2023-04-26 15:17:33

Vue 3開發(fā)前端

2009-09-28 09:55:46

Scala快速入門

2023-11-03 12:33:20

GoGORM

2009-07-22 07:50:00

Scala傳名參數(shù)

2009-07-22 09:22:20

Scala工廠對象

2009-12-11 10:42:00

Scala講座類定義構(gòu)造函數(shù)

2009-07-21 12:18:37

ScalaRational對象toString

2009-09-24 09:41:00

Scala講座Scala

2023-06-30 17:56:31

Scala元組

2009-07-08 09:47:49

Scala 2.8Scala

2021-10-04 14:56:09

機(jī)器學(xué)習(xí)函數(shù)參數(shù)

2022-05-11 10:45:21

SpringMVC框架Map
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號