2015-11-29 28 views
0

Effective Scala文章由Twitter,他們說以下內容:爲什麼Scala匹配優於if語句?

使用返回澄清和增強可讀性,但不是你會在命令式語言 ;避免使用它們來返回計算的結果 。代替

def suffix(i: Int) = { 
    if  (i == 1) return "st" 
    else if (i == 2) return "nd" 
    else if (i == 3) return "rd" 
    else    return "th" 
} 

喜歡:

def suffix(i: Int) = 
    if  (i == 1) "st" 
    else if (i == 2) "nd" 
    else if (i == 3) "rd" 
    else    "th" 

但使用匹配表達式優於任一:

def suffix(i: Int) = i match { 
    case 1 => "st" 
    case 2 => "nd" 
    case 3 => "rd" 
    case _ => "th" 
} 

在這個特定的例子中,爲什麼匹配表達式優於if/else?

回答

4

一般而言match更具可讀性,更清楚地解釋您的意圖。但在這個確切的例子中,它有一個額外的好處,那就是match不會發出一系列if s,而是一個switch字節碼指令(在這種情況下是tableswitch之一),這可能會提高性能。

可以斷言,在這種情況下switch將與@switch註釋發出:

def suffix(i: Int) = (i: @switch) match { 
    case 1 => "st" 
    case 2 => "nd" 
    case 3 => "rd" 
    case _ => "th" 
} 
+0

'很可能會提高性能bit.'什麼'一個bit'指任何粗略的估計? –

+0

@KevinMeredith在字節碼中,它實際上用單個tableswitch指令替換了3個比較(堆棧中的變量加載)。對於3次比較它應該是相當小的,除非它在一些緊密的循環中。但是在緊張的環境中,JIT開始了,然後情況可能會有很大的變化。此外,這個「用於匹配的發射開關」行爲非常脆弱:它僅適用於與文字常量和「最終val」標識符匹配。儘管如此,從可讀性和編碼風格來看,「匹配」也更好。因此,它陷入了「避免過早悲觀化」的情況:它總是優於一系列「if」 – Kolmar