错误:未找到:值S(Scala)

时间:2015-06-14 15:26:43

标签: arrays scala naming-conventions declaration

val Array(k,s) = readLine.split(" ").map(_.toInt)

此代码工作正常。但不是这样:

val Array(k,S) = readLine.split(" ").map(_.toInt)

在这里大写“s”会给我一个错误:error: not found: value S

发生了什么事?

2 个答案:

答案 0 :(得分:2)

使用k创建sval Array(k,s) = ...标识符时,您正在使用模式匹配来定义它们。

来自Scala Specifications 1.1 标识符):

  

模式匹配规则进一步区分变量   标识符,以小写字母开头,常量   标识符,但没有。

也就是说,当您说val Array(k,S) = ...时,您实际上将S与常量匹配。由于您未定义S,因此Scala报告error: not found: value S

请注意,如果定义了常量,Scala将抛出MatchError,但仍无法找到匹配项:

scala> val S = 3
S: Int = 3

scala> val Array(k, S) = Array(1, 3)
k: Int = 1

scala> val Array(k, S) = Array(1, 4)
scala.MatchError: [I@813ab53 (of class [I)
  ... 33 elided

答案 1 :(得分:1)

使用提取器时,以小写字符开头的符号将被解释为保存提取值的变量。另一方面,以大写字符开头的符号用于表示在外部作用域中声明的变量/值。

另一个例子:

@Override
public Object instantiateItem(ViewGroup container, int position) {
    GalleryFragment fragment = (GalleryFragment) super.instantiateItem(container, position);
    fragments[position] = fragment;
    return fragment;
}