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

在Scala中定義無參數方法

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

作為下一步,我們將向Element添加顯示寬度和高度的方法,展示在代碼10.2中。height方法返回contents里的行數。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 定義無參數方法width和height

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

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

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

  1. def width: Int  
這種無參數方法在Scala里是非常普通的。相對的,帶有空括號的方法定義,如def height(): Int,被稱為空括號方法:empty-paren method。推薦的慣例是在沒有參數并且方法僅通過讀含有對象的方式訪問可變狀態(專指其不改變可變狀態)時,使用無參數方法。這個慣例支持統一訪問原則:uniform access principleMeyer,面向對象軟件構造【Mey00】就是說客戶代碼不應受通過字段還是方法實現屬性的決定的影響。例如,我們可以選擇把width和height作為字段而不是方法來實現,只要簡單地在每個實現里把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. }  
兩組定義從客戶的觀點來看是完全相同的。唯一的差別是與的訪問或許稍微比方法調用要快,因為字段值在類被初始化的時候被預計算,而方法調用在每次調用的時候都要計算。換句話說,字段在每個Element對象上需要更多的內存空間。因此類的使用概況,屬性表達成字段還是方法更好,決定了其實現,并且這個概況還可以隨時改變。重點是Element類的客戶不應在其內部實現改變的時候受影響。

特別是如果類的字段變成了訪問函數,且訪問函數是純的,就是說它沒有副作用并且不依賴于可變狀態,那么類Element的客戶不需要被重寫。客戶都不應該需要關心這些。

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

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

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

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

總結起來,Scala里定義不帶參數也沒有副作用的方法為無參數方法,也就是說,省略空的括號,是鼓勵的風格。另一方面,永遠不要定義沒有括號的帶副作用的方法,因為那樣的話方法調用看上去會像選擇一個字段。這樣你的客戶看到了副作用會很奇怪。相同地,當你調用帶副作用的函數,請確信寫這個調用的時候包括了空的括號。另一種考慮這個問題的方式是,如果你調用的函數執行了操作,使用括號,但如果僅提供了對某個屬性的訪問,省略括號。

【相關閱讀】

  1. 學習Scala的二維布局庫和抽象類
  2. Scala學習:叫名參數by-name parameter
  3. Scala:如何編寫新的控制結構
  4. Scala學習:Curry化的函數
  5. Scala學習:簡化客戶代碼

責任編輯:book05 來源: Artima
相關推薦

2009-07-22 08:57:49

Scalafinal

2009-07-21 17:21:57

Scala定義函數

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定義函數

2009-07-22 07:43:00

Scala重復參數

2023-04-26 15:17:33

Vue 3開發前端

2009-11-16 17:04:46

Inside Scal

2023-11-03 12:33:20

GoGORM

2009-09-28 09:55:46

Scala快速入門

2009-12-11 10:42:00

Scala講座類定義構造函數

2009-07-22 09:22:20

Scala工廠對象

2009-07-22 07:50:00

Scala傳名參數

2023-06-30 17:56:31

Scala元組

2009-07-21 12:18:37

ScalaRational對象toString

2009-09-24 09:41:00

Scala講座Scala

2021-10-04 14:56:09

機器學習函數參數

2022-05-11 10:45:21

SpringMVC框架Map

2009-07-08 09:47:49

Scala 2.8Scala
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久亚洲国产| 国产免国产免费 | 欧美日韩在线一区二区三区 | 久久综合久色欧美综合狠狠 | 午夜激情网 | 在线观看av网站永久 | 国产福利91精品一区二区三区 | 国产成人99久久亚洲综合精品 | 欧美久久一级特黄毛片 | 国产精品视频久久久 | 亚洲a在线视频 | 久久久一区二区三区 | 在线亚州 | 国产午夜视频 | 久草在线青青草 | 自拍偷拍中文字幕 | 成人欧美一区二区三区1314 | 国产精品美女久久久久久久久久久 | а天堂中文最新一区二区三区 | 欧产日产国产精品国产 | 日日操夜夜操天天操 | 国产欧美综合在线 | 午夜视频精品 | av网站免费 | 天天精品在线 | 国产精品亚洲成在人线 | 亚洲成人免费视频 | 一区二区三区国产精品 | 亚洲成人一区 | 久久人体 | 精品视频在线免费观看 | 99久久久久久99国产精品免 | 国产日韩欧美在线 | www.婷婷 | 国产一区二区在线播放 | 日韩免费av一区二区 | 欧美天堂在线观看 | 九九视频在线观看视频6 | 99在线视频观看 | 亚洲精品在线视频 | 成年人免费在线视频 |