我尝试在 Scala 函数参数名称中使用尾随下划线以避免与关键字冲突type,但出现错误:
Welcome to Scala 2.13.1 (Java HotSpot(TM) 64-Bit Server VM, Java 11.0.1).
Type in expressions for evaluation. Or try :help.
scala> def foo(type_: Char): Char = type_
^
error: ':' expected but identifier found.
scala>
Run Code Online (Sandbox Code Playgroud)
我阅读了一些关于在 Scala 中使用下划线的解释,但没有一个提到我的情况
我相信这是词法分析器将其type_:视为有效参数名称的结果,并且解析器获取type_:标识符后跟Char类型。
在 Scala 中,将其:作为名称的一部分是有效的(例如::, +:, :+),(尽管这有一些限制,哪些可以和哪些不能与 组合:),因此可以区分何时:如此使用,何时不使用,编译器在标识符和类型归属之间使用空格(或不能在标识符中使用的其他字符,如括号)。如果没有歧义,则不需要此空格,但在像您这样的情况下,您必须将其写为:
def foo(type_ : Char): Char = type_
Run Code Online (Sandbox Code Playgroud)
否则编译器会假设你想写:
def foo(type_: : Char): Char = type_:
Run Code Online (Sandbox Code Playgroud)
typez: Char显然不会产生这种歧义,因为typez:它不是一个有效的标识符,与type0: Charandtype0:等相同,并且它不会编译(除非你使用了允许使用几乎任何名称的反引号)。但是,type_:IS 是一个有效的标识符,因此会出现歧义,您必须使用一些缩进手动解决它。