Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';我们在scala中的元组变量声明中有大写字母_Scala_Variables_Tuples - Fatal编程技术网

为什么可以';我们在scala中的元组变量声明中有大写字母

为什么可以';我们在scala中的元组变量声明中有大写字母,scala,variables,tuples,Scala,Variables,Tuples,为什么我们不能在元组变量中使用大写字母,因为我创建了一个TestData,它会抛出一个错误 val (trainingData, TestData): Tuple2[RDD[LabeledPoint],RDD[LabeledPoint]] = (splits(0), splits(1)) 这是因为在您的案例中没有创建普通变量 val (trainingData, TestData) = 这是使用左侧的模式匹配解构右侧表达式。因此,模式匹配表达式中的变量必须以小写字母开头 val (tra

为什么我们不能在元组变量中使用大写字母,因为我创建了一个
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 (ch, num)       = ('x', 17)  // OK
val (Run, distance) = (true, 5)  // error: not found: value Run
为什么呢?这是因为编译器需要区分“常量模式”和“变量模式”。这在[PiS()]中有详细解释,但其要点是,前导大写字母被视为常量,这意味着模式必须与此值完全匹配,前导小写字母被视为变量,它将匹配任何值,并且该变量也绑定到该值

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

值得注意的是,小写is variable规则(使用backticks)有一个变通方法,但无法回避大写is constant规则。

感谢您的解释,但为什么在开始时case需要小写变量?小写变量用于将变量与值绑定,而大写变量用于与变量名匹配。这有助于您了解更多信息
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*/
}