错误:':'预期但找到标识符

时间:2014-04-17 01:58:47

标签: scala syntax scala-2.9

由于type是保留字,因此在将其用作标识符时会附加下划线。 (我找不到关于此的风格推荐。)

val type_ = "abc"

但后来我用它作为参数标识符。

def f(id: String, type_: String, typeName: String) = Map(
    "id" -> id,
    "type" -> type_,
    "typeName" -> typeName
)

println(f("a", "simple", "test"))

但是我收到了错误

error: identifier expected but 'type' found.
def f(type: String) = 1

type_:之间加一个空格可以修复它

def f(id: String, type_ : String, typeName: String)

虽然这与the recommended Scala style相反。

这是Scala编译器中的错误吗?我还没能找到Scala语法的任何语法,所以我无法确定。

2 个答案:

答案 0 :(得分:2)

在scala中,变量名中的_专门用于表示所有以下字符都是变量名称的一部分,直到空格为止。所以在你的情况下type_是一个很好的变量名,但当你把它放在一个方法签名type_:时,它会将冒号推断为变量名的一部分,因为它之间没有空格。冒号和下划线。有关详细信息,请参阅Programming Scala的第54页。

从书中解释,他们这样做的原因是你可以做xyz_++=之类的事情作为变量或方法名称,因为xyz++=将被作为运算符xyz ++=进行交织。 / p>

答案 1 :(得分:1)

当您撰写type_:时,它认为type_:是变量的名称,而不是认为type_是变量名称而:是一个单独的东西。这是一个简单的例子:

scala> val x_: = 2
x_:: Int = 2

scala> x_:
res0: Int = 2

scala> x_: + 3
res1: Int = 5

将空格放在那里告诉编译器: 不是变量名的一部分。

所以:要么保留空间,要么转储下划线。