为什么我们不能有大写字母在一个元组变量,我创建了一个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-字母待使用换模式匹配换限定值 –