如何解决为什么函数参数名称中不允许使用下划线?
我尝试在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>
我阅读了有关在Scala中使用下划线的几种解释,但没有一个提及我的情况
解决方法
我认为这是词法分析器将type_:
作为有效参数名称,并且解析器获得type_:
标识符后跟Char
类型的结果。
在Scala中,将:
作为名称的一部分是有效的(例如::
,+:
,:+
),(尽管这有一些限制,但可以并且不能与:
结合使用的字符),以便能够区分何时使用:
以及何时不使用def foo(type_ : Char): Char = type_
,编译器使用空格(或不能在标识符中使用的其他字符,例如方括号)在标识符和类型说明之间。如果没有歧义,则不需要此空格,但是在像您这样的情况下,您必须将其写为:
def foo(type_: : Char): Char = type_:
否则编译器将假定您要编写:
typez: Char
typez:
显然不会产生这种歧义,因为type0: Char
不是有效的标识符,与type0:
和type_:
等一样,并且不会编译(除非您使用了反引号,从而允许使用几乎任何名称)。但是,ecall
是有效的标识符,因此会出现歧义,因此您必须使用一些缩进来手动解决它。
与您的情况相关的下划线的用法是在标识符中分隔字母数字和运算符。如果要在标识符中混合使用字母数字字符和运算符,则必须用下划线将它们分隔开,例如foo?
不是合法标识符,但foo_?
是合法标识符。
根据同样的逻辑,type_:
是有效的标识符,这就是解释代码的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。