2016-11-06 100 views
2
def arrange(str1: String, str2: String): (String, String) = { 
    if (str1 == "YELLOW") { 
     return (str1, str2) 
    } else { 
     return (str2, str1) 
    } 
    } 

我想,我可能更習慣的方法如何使用模式匹配Scala中

回答

6
def arrange(str1: String, str2: String) = str1 match { 
    case "YELLOW" => str1 -> str2 
    case _ => str2 -> str1 
    } 
+0

對不起,我不完全明白這一點。什麼是' - >'在做什麼? – samol

+0

這只是創建元組的一種奇特方式。 'str1 - > str2'與'(str1,str2)'是一樣的。例如,當創建一個地圖'Map(「foo」 - >「bar」,「baz」 - >「bat」)時,這很方便。 – Dima

1

有幾種方法來提高你的代碼寫這個使用模式匹配以慣用的方式安排退貨訂單。

首先,if是一個表達式,而不是一個語句。 (幾乎所有的Scala是一種表達。)所以,你可以在if表達的只是return的結果,而不是return荷蘭國際集團各個分支表達式:

def arrange(str1: String, str2: String): (String, String) = { 
    return if (str1 == "YELLOW") { 
    (str1, str2) 
    } else { 
    (str2, str1) 
    } 
} 

第二,最後一個表達式的塊中計算的值,函數或方法是整個塊,函數或方法的價值,所以我們可以得到完全擺脫return的:

def arrange(str1: String, str2: String): (String, String) = { 
    if (str1 == "YELLOW") { 
    (str1, str2) 
    } else { 
    (str2, str1) 
    } 
} 

接下來,如果一個塊只包含一個單一的表達,那麼你不」 t需要塊,因此您可以擺脫括號。這不僅適用於if分支:

def arrange(str1: String, str2: String): (String, String) = { 
    if (str1 == "YELLOW") (str1, str2) else (str2, str1) 
} 

和方法體:

def arrange(str1: String, str2: String): (String, String) = 
    if (str1 == "YELLOW") (str1, str2) else (str2, str1) 

最後,Scala有返回類型推斷;一般來說,你不需要明確聲明方法的返回類型。你可以陳述它,但它通常只是在不明顯的情況下習慣用法。

def arrange(str1: String, str2: String) = 
    if (str1 == "YELLOW") (str1, str2) else (str2, str1) 

所以,這看起來已經比原來的版本更好了一大堆,即使純語法的變化,也沒有留下相似的轉換模式匹配任何語義的變化。

0

如果你真的想使用模式匹配:

def arrange(str1: String, str2: String) = str1 match { 
    case "YELLOW" => (str1, str2) 
    case _ => (str2, str1) 
} 

但對於這樣一個簡單的條件,一個是if我們真正需要。要在這個問題表達「地道」,只是下降的return,因爲在斯卡拉,if是一個表達式,而不是流控制語句:

def arrange(str1: String, str2: String): (String, String) = 
    if (str1 == "YELLOW") (str1, str2) else (str2, str1) 

principle of least power是很好的指導:

http://www.lihaoyi.com/post/StrategicScalaStylePrincipleofLeastPower.html