Scala 为什么函数参数名中不允许尾随下划线?
我尝试在Scala函数参数名称中使用尾随下划线,以避免与关键字类型冲突,但出现错误: 欢迎使用Scala 2.13.1 Java HotSpotTM 64位服务器虚拟机Java 11.0.1。 键入要计算的表达式。或者尝试:帮助。 scala>def footype_u2;:Char:Char=type_ ^ 错误:“:”应为,但找到标识符。 斯卡拉>Scala 为什么函数参数名中不允许尾随下划线?,scala,Scala,我尝试在Scala函数参数名称中使用尾随下划线,以避免与关键字类型冲突,但出现错误: 欢迎使用Scala 2.13.1 Java HotSpotTM 64位服务器虚拟机Java 11.0.1。 键入要计算的表达式。或者尝试:帮助。 scala>def footype_u2;:Char:Char=type_ ^ 错误:“:”应为,但找到标识符。 斯卡拉> 我读了一些关于Scala中下划线使用的解释,但没有一个提到我的案例我相信这是一个lexer将类型\视为有效参数名,解析器获得类型\标识符,后跟C
我读了一些关于Scala中下划线使用的解释,但没有一个提到我的案例我相信这是一个lexer将类型\视为有效参数名,解析器获得类型\标识符,后跟Char type的结果 在Scala中,将:作为名称的一部分是有效的,例如::,+:,:+,尽管这有一些可以和不能与:,组合的限制条件,以便区分何时使用:,何时不使用:,编译器使用空格或标识符中不能使用的其他字符,类似于标识符和类型归属之间的括号。如果不存在歧义,则不需要此空格,但在类似您的情况下,您必须将其写成:
def foo(type_ : Char): Char = type_
或者编译器会假设您想要编写:
def foo(type_: : Char): Char = type_:
显然,typez:Char并没有产生这种歧义,因为typez:不是有效的标识符,与type0:Char和type0:,等等一样。除非您使用允许使用几乎任何名称的反勾号,否则它不会编译。但是,类型\是一个有效的标识符,因此出现了歧义,您必须通过一些缩进来手动解决它。我相信这是词法分析器将类型\视为有效的参数名,解析器获得类型\标识符,后跟字符类型的结果 在Scala中,将:作为名称的一部分是有效的,例如::,+:,:+,尽管这有一些可以和不能与:,组合的限制条件,以便区分何时使用:,何时不使用:,编译器使用空格或标识符中不能使用的其他字符,类似于标识符和类型归属之间的括号。如果不存在歧义,则不需要此空格,但在类似您的情况下,您必须将其写成:
def foo(type_ : Char): Char = type_
或者编译器会假设您想要编写:
def foo(type_: : Char): Char = type_:
显然,typez:Char并没有产生这种歧义,因为typez:不是有效的标识符,与type0:Char和type0:,等等一样。除非您使用允许使用几乎任何名称的反勾号,否则它不会编译。但是,类型\是一个有效的标识符,因此会出现歧义,您必须通过一些缩进手动解决它。在您的案例中,下划线的使用是分隔标识符中的字母数字字符和运算符字符。如果要在标识符中混合使用字母数字字符和运算符字符,它们必须用下划线分隔,例如foo?不是一个合法的标识符,但是foo_?是
根据相同的逻辑,类型\是一个有效的标识符,这就是代码的解释方式。在您的案例中,下划线的使用是分隔标识符中的字母数字字符和运算符字符。如果要在标识符中混合使用字母数字字符和运算符字符,它们必须用下划线分隔,例如foo?不是一个合法的标识符,但是foo_?是
根据相同的逻辑,type是有效的标识符,这就是代码的解释方式。要避免与关键字type的冲突,可以使用反引号def foo`type`:Char:Char=`type`来避免与关键字type的冲突,可以使用反引号def foo`type`:Char:Char=`type`