为什么我们不能在scala中的元组变量声明中使用大写字母

时间:2017-06-23 05:31:06

标签: scala variables tuples

为什么我们在元组变量中没有大写字母,因为我创建了TestData它会抛出错误

val (trainingData, TestData): Tuple2[RDD[LabeledPoint],RDD[LabeledPoint]] = (splits(0), splits(1))


enter image description here

2 个答案:

答案 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*/
}

值得注意的是,小写变量规则有一个变通方法(使用反引号)但是没有办法回避大写常量规则。