Scala 中為什麼不建議用 return 關鍵字

2022-03-09 17:48:12 字數 2283 閱讀 3226

在scala中使用 return 的話,編譯的時候會提示the latest statement is method is automatically returned, use of th return keyword is redundant.

這個警告是說最後乙個語句的結果會自動返回,不需要使用return語句。 scala 不建議使用 return 關鍵字,這一點在剛剛接觸函式式程式設計的時候感覺非常難受。

有 return 會讓**結果更清晰不是麼?在查閱之後,整理了以下幾點不建議使用 return 關鍵字的原因。

1.要寫函式而不是指令

函式式程式設計的乙個重要理念就是要盡量使**由無狀態的函式構成,而不是給計算機發出指令。例如

f(x) = x + 1    //式1.1

1

是乙個函式。

scala會自動將最後乙個表示式的結果作為返回結果

def f(x:int) = x + 1    //式1.2

def f(x:int):int = return x + 1 //式1.3

12

從以上兩種分別使用和不使用 return 的表達方式來看,不使用 return 看起來更接近函式,而使用了 return 則更像指令。

2.return影響型別推斷

scala中的型別推斷機制會自動將最後乙個表示式的型別作為返回型別,例如式1.2中,函式能夠自動識別結果為int型別。如果使用了return語句,就會破壞型別推斷機制,需要顯式註明返回型別,例如式1.3。

3.使用return返回含義模糊

有時使用了return會讓**的返回更加混亂,這個歧義主要產生於return到底返回到哪一層函式。

def add(n:int, m:int): int = return n + m     //式3.1

def sum1(ns: int*): int = ns.foldleft(0)(add) //式3.2

12

例如上述**,目前來看還沒有什麼問題,但是如果寫成下面的形式

def sum2(ns: int*): int = ns.foldleft(0)((n,m) => return n+m)    //式3.3

1

直觀感受式3.3與3.1+3.2應該是等效的。但事實上sum1(1,2,3) = 6,而sum2(1,2,3) = 1.

原因就是return語句會直接讓它所出現的函式返回。也就會直接break foldleft的迴圈返回結果。

再看另外乙個例子:

def foo: int = 

1234

首先定義乙個匿名函式,在呼叫匿名函式的時候,相當於return語句出現在了foo函式中。因此foo() = 1

4.nonlocalreturncontrol

在scala的迴圈中的return實際上是通過拋異常實現的,編譯後發現

return value

1

被編譯成了

throw new nonlocalreturncontrol(key/*metadata*/, value)

1

而nonlocalreturncontrol的原始碼為:

class nonlocalreturncontrol[@specialized t](val key: anyref, val value: t) extends controlthrowable 

123

可以看到nonlocalreturncontrol異常繼承了throwable,並且為了提公升效能重寫了fillinstacktrace不填入堆疊資訊。這樣一來,如果我們在**中為了保護**不crash而這樣寫:

def fun(n:int):string = else}""

}catch

}12345678910111213

最終得到的結果字串則為scala.runtime.nonlocalreturncontrol,並不是我們預期的結果。

5.應當怎麼做

實際開發中我們會經常遇到貌似必須使用return的時候,那應該怎麼辦呢?

首先,scala既然提供了 return 關鍵字,說明它並不是禁止使用,而是需要考慮清楚是否必須這麼做。在scala認為,所有的需要使用 return 來 break 的迴圈,都是可以通過轉化為遞迴來替代的,並且效能方面 scala 也專門為遞迴做了優化。

scala中為什麼不建議用return

在scala中使用return的話,編譯的時候會提示the latest statement is method is automatically returned,use of th return keyword is redundant.這個警告是說最後乙個語句的結果會自動返回,不需要使用ret...

為什麼不建議用Table布局

tables的缺點 3 table裡顯示時需要你把單個 有邏輯性的切成多個圖。增加設計的複雜度,增加頁面載入時間,增加http會話數。4 在某些瀏覽器中table裡的文字的拷貝會出現問題。這會讓使用者不悅。5 table會影響其內部的某些布局屬性的生效 比如裡的元素的height 100 這會限制你...

html學習 一 為什麼不建議用table進行布局

這幾天在寫乙個html頁面,之前做畢設的時候曾經嘗試過寫乙個 首頁的頁面,怎麼說呢,html學起來知識點挺多挺脆,但是你學乙個就能用,不想學後端框架那些的是乙個整體的架構。之前學的html全都忘得差不多了,又得重寫學習。這次給了我乙個模板,讓我照著寫。我開啟看了一下,布局選用的是table布局,我以...