Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 为什么函数参数名中不允许尾随下划线?_Scala - Fatal编程技术网

Scala 为什么函数参数名中不允许尾随下划线?

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函数参数名称中使用尾随下划线,以避免与关键字类型冲突,但出现错误:

欢迎使用Scala 2.13.1 Java HotSpotTM 64位服务器虚拟机Java 11.0.1。 键入要计算的表达式。或者尝试:帮助。 scala>def footype_u2;:Char:Char=type_ ^ 错误:“:”应为,但找到标识符。 斯卡拉>
我读了一些关于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`