2016-08-20 73 views
3

我創建了一個函數來從Pascal三角形中檢索給定值,並且我使用了if語句。現在我想重構函數來使用模式匹配。與元組匹配的Scala模式:匹配元組中的相等值

if基於函數如下:

def valueAt(row: Int, column: Int): Int = { 
    // ... 
    else if (row == column) 1 // last column 
    // 
} 

我的第二個版本的功能,使用模式匹配具有以下特徵:

def valueAt2(row: Int, column: Int): Int = (row, column) match { 
    // ... 
} 

是否有可能定義一個case何時rowcolumn具有相同的值?

我在case使用相同的變量名試過了,是這樣的:

case (x, x) => 1 // last column 

的,我也嘗試使用row的值列,就像這樣:

case (_, row) => 1 // last column 

但他們不工作。在第一種情況下,我有一個編譯錯誤,第二種情況下,IDE說我正在從match映射變量row

這可能嗎?

謝謝。

回答

3

這是第一個,使用一個,如果後衛:

(1, 2) match { case (x, y) if x == y => 1; ... } 

對於第二個,當你想匹配一個變量(而不是結合和遮蔽它),你可以使用反引號('):

(1, 2) match { case (_, `row`) => 1; ... } 
2

您可以使用後衛,這是一個CASE表達式,可以檢查非穩定狀態的一部分,並沒有出奇相似的if聲明:

(row, column) match { 
    case (x, y) if x == y => 1 
    // other cases... 
} 

注意,輸入不匹配這個後衛(即其中x != y)會繼續檢查其他情況,因此,例如,另一種情況case (x, y) => ...可以跟隨,並假設x != y