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 ):

! # % & * + - / : < = > ? @ ^ | ~ ! # % & * + - / : < = > ? @ ^ | ~还有SmSo除了括号和句点。

(编辑:在这里添加有效的例子:)。 总之,下面是一些有效的例子,突出显示了所有情况 - 在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

  • 卢(大写字母)
  • Ll(小写字母)
  • Lo(其他字母)
  • Lt(titlecase)
  • Nl(字母数字,如罗马数字)
  • Sm(符号数学)
  • 所以(其他符号)
  • 笔记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:

    其他与操作符相关的保留字: _ : = => <- <: <% >: # @还有u21D2u2190


    语言规范。 在第1章中给出了规则,词法语法(第3页):

  • 操作员字符。 这些由所有可打印的ASCII字符 u0020- u007F组成。 它们不在上面的集合中,数学符号(Sm)和其他符号(So)。
  • 这与您在Scala编程中编程的摘录基本相同。 +不是一个Unicode数学符号,但绝对是上面没有列出的ASCII可打印字符(不是一个字母,包括_或$,一个数字,一个palenthesis,一个分隔符)。

    在你的清单中:

  • #是非法的,不是因为字符不是运算符字符(#^是合法的),而是因为它是保留字(第4页),用于类型投影。
  • &2是非法的,因为您将操作员字符和非操作员字符(数字2)混合在一起
  • £2是合法的,因为£不是一个操作符:它不是一个七位ASCII,而是八位扩展ASCII。 这不好,因为$也不是一个(它被认为是一封信)。
  • 链接地址: http://www.djcxy.com/p/12633.html

    上一篇: Valid identifier characters in Scala

    下一篇: Using google's protobuf in python without installing it