为什么我们在元组变量中没有大写字母,因为我创建了TestData
它会抛出错误
val (trainingData, TestData): Tuple2[RDD[LabeledPoint],RDD[LabeledPoint]] = (splits(0), splits(1))
答案 0 :(得分:3)
这是因为您没有在您的案例中创建普通变量。
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)
}
希望这有帮助!
答案 1 :(得分: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*/
}
值得注意的是,小写变量规则有一个变通方法(使用反引号)但是没有办法回避大写常量规则。