val Array(k,s) = readLine.split(" ").map(_.toInt)
此代码工作正常。但不是这样:
val Array(k,S) = readLine.split(" ").map(_.toInt)
在这里大写“s”会给我一个错误:error: not found: value S
发生了什么事?
答案 0 :(得分:2)
使用k
创建s
和val 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;
}