2017-06-23 78 views

回答

2

这是因为你没有在你的情况下创建一个普通的变量。

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) 
} 

希望这有助于!

+0

感谢您的解释,但是为什么case在启动时需要小写变量? – wctapasadan

+0

小写变量用于将变量与值绑定,其中,大写变量用于匹配变量名称。这有助于您理解更多信息https://stackoverflow.com/questions/35217913/why-cant-upper-case-字母待使用换模式匹配换限定值 –

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

值得一提的是没有为小写,为变量规则(使用反引号)的方法,但也没有办法回避的大写,是恒定的规则。

相关问题