Scala中的有效标识符字符
我发现一件令人困惑的事情是知道我可以在方法和变量名称中使用哪些字符和组合。 例如
val #^ = 1 // legal
val # = 1 // illegal
val + = 1 // legal
val &+ = 1 // legal
val &2 = 1 // illegal
val £2 = 1 // legal
val ¬ = 1 // legal
据我了解,字母数字标识符和运营商标识符之间有区别。 除非用下划线(混合标识符)分隔,否则您可以混合匹配或不匹配。
从Scala 6.10节的编程中,
运营商标识符由一个或多个运营商字符组成。 操作员字符是可打印的ASCII字符,例如+,:,?,〜或#。
更确切地说,一个操作符属于Unicode数学符号集(Sm)或其他符号(So),或7位ASCII字符不是字母,数字,括号,方括号,大括号,单或双引号或下划线,句号,分号,逗号或回刻字符。
所以我们被排除在使用()[]{}'"_.;,
和`之外
我查了维基百科上的Unicode数学符号,但是我发现的符号不包括+
, :
, ?
等等。有什么操作符字符的地方有一个明确的列表?
此外,为什么Unicode数学运算符(而不是符号)不被视为运算符?
使用规范中的EBNF语法工作:
upper ::= ‘A’ | ... | ‘Z’ | ‘$’ | ‘_’ and Unicode category Lu
lower ::= ‘a’ | ... | ‘z’ and Unicode category Ll
letter ::= upper | lower and Unicode categories Lo, Lt, Nl
digit ::= ‘0’ | ... | ‘9’
opchar ::= “all other characters in u0020-007F and Unicode
categories Sm, So except parentheses ([]) and periods”
但也要考虑词法语法的开始,它定义了:
Parentheses ‘(’ | ‘)’ | ‘[’ | ‘]’ | ‘{’ | ‘}’.
Delimiter characters ‘‘’ | ‘’’ | ‘"’ | ‘.’ | ‘;’ | ‘,’
这是我想出的。 通过在范围u0020-007F
消除,消除字母,数字,括号和分隔符,我们有opchar
...( opchar
):
! # % & * + - / : < = > ? @ ^ | ~
! # % & * + - / : < = > ? @ ^ | ~
还有Sm
和So
除了括号和句点。
(编辑:在这里添加有效的例子:)。 总之,下面是一些有效的例子,突出显示了所有情况 - 在REPL中注意 ,我必须逃避
:
val !#%&*+-/:<=>?@^|~ = 1 // all simple opchars
val simpleName = 1
val withDigitsAndUnderscores_ab_12_ab12 = 1
val wordEndingInOpChars_!#%&*+-/:<=>?@^|~ = 1
val !^©® = 1 // opchars ans symbols
val abcαβγ_!^©® = 1 // mixing unicode letters and symbols
注1:
我发现这个Unicode类别索引找出Lu, Ll, Lo, Lt, Nl
:
笔记2:
val #^ = 1 // legal - two opchars
val # = 1 // illegal - reserved word like class or => or @
val + = 1 // legal - opchar
val &+ = 1 // legal - two opchars
val &2 = 1 // illegal - opchar and letter do not mix arbitrarily
val £2 = 1 // working - £ is part of Sc (Symbol currency) - undefined by spec
val ¬ = 1 // legal - part of Sm
注3:
其他与操作符相关的保留字: _ : = => <- <: <% >: # @
还有u21D2
和u2190
←
语言规范。 在第1章中给出了规则,词法语法(第3页):
这与您在Scala编程中编程的摘录基本相同。 +
不是一个Unicode数学符号,但绝对是上面没有列出的ASCII可打印字符(不是一个字母,包括_或$,一个数字,一个palenthesis,一个分隔符)。
在你的清单中:
$
也不是一个(它被认为是一封信)。 上一篇: Valid identifier characters in Scala
下一篇: Using google's protobuf in python without installing it