Scala scala中不建議使用return

2021-10-04 07:58:46 字數 1685 閱讀 1477

在scala中使用return的話,編譯的時候會提示

the latest statement is method is automatically returned, use of th return keyword is redundant.
這個警告是說最後乙個語句的結果會自動返回,使用return關鍵字是多餘的。

在查閱之後,整理了以下幾點不建議使用return關鍵字的原因

要寫函式而不是指令

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

簡單地講,函式式程式設計差不多追求的就是**塊[函式]寫得和數學表示差不多,這樣才清晰,比如數學中:

f(x) = x + 1
對應的scala**為:

def f(x:int) = x + 1 

def f(x:int):int = return x + 1

從scala兩個寫法中分別使用和不使用return地表示式來看,除了def關鍵字和對引數地型別標記外,不使用return看起來就是函式,而使用了return更像指令

使用return會影響型別推斷

scala中的型別推斷機制會自動將最後乙個表示式的型別作為返回型別,函式能自動識別結果為某型別。

如果使用了return語句,就會破壞型別推斷機制,需要顯示註明返回型別。

使用return返回含義模糊

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

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

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

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

def sum2(ns:int*):int = ns.foldleft(0)((n,m) => return n+m)
直觀感受,上面兩種寫法是一致的,但事實上sum1(1,2,3) = 6,sum2(1,2,3) = 1

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

再看另乙個例子:

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

這裡可以提到乙個點,anonymous function中的return

scala是用丟擲異常的方式來實現anonymous func中的return的,anonymous function中的return是以nonlocalreturnexception實現的

關於anonymous function中的return具體的解釋如下**:

處理方法

實際開發中我們會經常遇到貌似必須使用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...

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

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

不建議mysql分割槽表

緣起 業內進行一些技術交流的時候也更多的是自己分庫分表,而不是使用分割槽表。解決什麼問題?回答 當mysql單錶的資料庫過大時,資料庫的訪問速度會下降,資料量大 問題的常見解決方案是 水平切分 mysql常見的水平切分方式有哪些?回答 分庫分表,分割槽表 什麼是mysql的分庫分表?回答 把乙個很大...