Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的有效标识符字符_Scala_Operators - Fatal编程技术网

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页)中给出了规则:

  • 运算符字符。这些字符由所有可打印的ASCII字符组成 字符\u0020-\u007F。不在上述集合中, 数学符号-波士(Sm)和其他符号(So)
  • 这基本上与Scala编程中的编程摘录相同。
    +
    不是Unicode数学符号,但它肯定不是上面列出的符号(不是字母,包括u或$、数字、偏旁符号、分隔符)

    在您的列表中:

  • #不合法,不是因为该字符不是运算符字符 (#^是合法的),但因为它是一个保留字(在第4页),用于类型投影
  • &2是非法的,因为您混合了运算符字符和非运算符字符,即数字2
  • 英镑2是合法的,因为英镑不是运算符字符:它不是七位ASCII,而是8位扩展ASCII。它不好,因为
    $
    也不是一个字符(它被认为是一个字母)

  • 使用规范中的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