我觉得很困惑的一件事是知道我可以在方法和变量名中使用哪些字符和组合。例如
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字符不是字母,数字,括号,正方形 括号,花括号,单引号或双引号或下划线, 句号,分号,逗号或后退字符。
因此我们被排除在使用()[]{}'"_.;,
和`
我在Wikipedia上查找了Unicode数学符号,但我发现的那些符号不包括+
,:
,?
等。是否有某个确定的列表操作员角色是什么?
此外,任何想法为什么Unicode数学运算符(而不是符号)不算作运算符?
答案 0 :(得分:61)
使用规范中的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
...(鼓号):
<强> ! # % & * + - / : < = > ? @ \ ^ | ~
强>
以及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 category index来找出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 :(得分:10)
The language specification。给出了第1章中的规则,词法语法(第3页):
- 操作员角色。这些包括所有可打印的ASCII 字符\ u0020- \ u007F。以上都没有, 数学符号(Sm)和其他符号(So)。
醇>
这与您在Scala中编程编程的摘录基本相同。 +
不是Unicode数学符号,但它绝对是上面未列出的ASCII printable character(不是字母,包括_或$,数字,副词,分隔符)。
在您的列表中:
$
也不是一个(它被认为是一封信)。