2017-06-23 81 views

回答

2

這是因爲你沒有在你的情況下創建一個普通的變量。

val (trainingData, TestData) = 

這是使用左側的模式匹配解構右側表達式。因此模式匹配表達式中的變量必須以小寫字母開頭。

val (trainingData, TestData) = (split(0), split(1)) 

將相當於

(split(0), split(1)) match { 
     case (trainingData, TestData) => (trainingData, TestData) 
    } 

它試圖兩個分裂值分配給trainingData,TESTDATA其失敗,因爲它總是隻在起動時的小寫變量接受。

相反,這會工作得很好

val (trainingData, testData) = (split(0), split(1)) 

這意味着,

(split(0), split(1)) match { 
     case (trainingData, testData) => (trainingData, testData) 
} 

希望這有助於!

+0

感謝您的解釋,但是爲什麼case在啓動時需要小寫變量? – wctapasadan

+0

小寫變量用於將變量與值綁定,其中,大寫變量用於匹配變量名稱。這有助於您理解更多信息https://stackoverflow.com/questions/35217913/why-cant-upper-case-字母待使用換模式匹配換限定值 –

1

在Scala中,您可以使用大寫字母創建變量。 (不推薦,但可以完成。)

val TestCnt = 7 

但是,當通過模式匹配創建變量時,您無法這樣做。

val (ch, num)  = ('x', 17) // OK 
val (Run, distance) = (true, 5) // error: not found: value Run 

這是爲什麼?這是因爲編譯器需要區分「恆定模式」和「可變模式」。這在Section 15.2, "Kinds of Patterns" [PiS(1st Edition)]中有一些詳細的解釋,但其要點在於大寫字母被認爲是一個常量,這意味着該模式必須完全匹配這個值,並且一個前導小寫字母被認爲是一個變量,它將匹配任何值並且該變量也綁定到該值。

someTuple match { 
    case ('t', 42) => /*will match only if both elements match these values*/ 
    case (_, TestCnt) => /*will match only if 2nd element same value as TestCnt*/ 
    case (c, n)  => /*will match any 2-ple, variables c,n bound to values*/ 
} 

值得一提的是沒有爲小寫,爲變量規則(使用反引號)的方法,但也沒有辦法迴避的大寫,是恆定的規則。

相關問題