Scala中的有效标识符字符
我发现有一件事很让人困惑,那就是知道我可以在方法名和变量名中使用哪些字符和组合。比如说Scala中的有效标识符字符,scala,operators,Scala,Operators,我发现有一件事很让人困惑,那就是知道我可以在方法名和变量名中使用哪些字符和组合。比如说 val #^ = 1 // legal val # = 1 // illegal val + = 1 // legal val &+ = 1 // legal val &2 = 1 // illegal val £2 = 1 // legal val ¬ = 1 // legal 据我所知,字母数字标识符和运算符标识符之间有区别。您可以混合匹配项中的一个或另一个,但不能混合两者,除非用
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数学运算符(而不是符号)不算作运算符吗?在第1章词汇语法(第3页)中给出了规则:
+
不是Unicode数学符号,但它肯定不是上面列出的符号(不是字母,包括u或$、数字、偏旁符号、分隔符)
在您的列表中:
$
也不是一个字符(它被认为是一个字母)使用规范中的EBNF语法:
upper::='A'|…|'Z'|'$'|'|'和Unicode类别Lu
下::='a'|…|'z'和Unicode类别Ll
字母::=上限|下限和Unicode类别Lo、Lt、Nl
数字::=“0”|……|“9”
opchar::=“所有\u0020-007F和Unicode中的其他字符
类别Sm,因此括号([])和句点除外“
但也要考虑到词法语法的最初定义:
括号“(“|”)“|”[“|”]“|”{“|”}”。
分隔符字符''.'''.''.'.'.'.'.'.'.'.'.''.'和''
这是我想到的。通过消除范围\u0020-007F
中的字母、数字、圆括号和分隔符,我们为opchar
。。。(drumroll):
!#%&*+-/:<=>?@^~代码>
还有和-括号和句点除外
(编辑:在此处添加有效示例:)。总之,这里有一些有效的例子,突出了所有的情况-注意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
注3:
其他操作员查看的内容都是保留字:
。==>谢谢。此外,正如规范所述,我们仅限于Unicode基本多语言平面字符,即2字节字符up\ufffd。因此,从So
,\u262f阴阳运算符是合法的,但\u1f360烤红薯运算符不受支持(它被解释为\u1f36+'0')。在Scala 2.9中,
现在被报告为非法字符
(可能是规范中正确的行为)。字符§也无效。知道为什么吗?我特别想念你。Scala承诺人们可以编写使用智能变量(和方法)名称的代码。但不能给变量x²赋值。非法字符。“数学符号(Sm)和其他符号(So)”是“包含”或“不包含”的对象?
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