爲什麼我們不能有大寫字母在一個元組變量,我創建了一個TestData
它拋出一個錯誤我們爲什麼不能在元組變量聲明大寫字母階
val (trainingData, TestData): Tuple2[RDD[LabeledPoint],RDD[LabeledPoint]] = (splits(0), splits(1))
爲什麼我們不能有大寫字母在一個元組變量,我創建了一個TestData
它拋出一個錯誤我們爲什麼不能在元組變量聲明大寫字母階
val (trainingData, TestData): Tuple2[RDD[LabeledPoint],RDD[LabeledPoint]] = (splits(0), splits(1))
這是因爲你沒有在你的情況下創建一個普通的變量。
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)
}
希望這有助於!
在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*/
}
值得一提的是沒有爲小寫,爲變量規則(使用反引號)的方法,但也沒有辦法迴避的大寫,是恆定的規則。
感謝您的解釋,但是爲什麼case在啓動時需要小寫變量? – wctapasadan
小寫變量用於將變量與值綁定,其中,大寫變量用於匹配變量名稱。這有助於您理解更多信息https://stackoverflow.com/questions/35217913/why-cant-upper-case-字母待使用換模式匹配換限定值 –