作者:别想着摆脱_525 | 来源:互联网 | 2023-01-31 15:08
我偶然发现了这个文档,并想知道这是什么.显然,您可以在标识符中包含某些控制字符,并忽略它们:
public static void main(String[] args) throws Exception {
int dummy = 123;
System.out.println(d?ummy); // Has U+200B after the `d` before the `u`
}
我在JLS中找不到任何相关内容.IntelliJ IDEA在编辑器中给出一个错误,称"dummy"是一个未声明的标识符(但它编译并运行).我猜这是IntelliJ中的一个错误?这些"可忽视的角色"的目的是什么?
(注意:StackOverflow似乎从问题中删除了我的控制字符)
1> Manos Nikola..:
这个矛盾存在一个悬而未决的问题.
总之,编译器对标识符名称匹配确实忽略了这些字符,但JLS没有提到这一点.相反,JLS说:
两个标识符只有在相同时才相同,即每个字母或数字具有相同的Unicode字符.
也
"Java letter-or-digit"是Character.isJavaIdentifierPart(int)方法返回true的字符
矛盾显而易见:
Character.isJavaIdentifierPart('\u0001') -> true, so used to compare identifier names
Character.isIdentifierIgnorable('\u0001') -> true, should be ignored actually
我推测Intellij IDEA遵循JLS,或者他们根本不知道可忽略的字符.我没有看到这个bug报告在这里.
至于这些无知的目的是什么,unicode指定了一些布局和格式控制字符.建议在标识符名称中忽略这些字符
它们所代表的效果是风格的或者超出标识符的范围,其次是因为字符本身通常没有可见的显示
显然,目的isIdentifierIgnorable
是识别这一类别的人物.例如,它在isIdentifierIgnorable文档中提到它true
为具有FORMAT常规类别值的字符返回,这些字符是具有unicode General_Category值Cf的字符,它们包含在布局和格式控制字符中
虽然如此,但这并没有回答被问到的问题:*"这些"可忽视的角色"服务的目的是什么?"*
@RealSkeptic:`_`也不是字母或数字,但它在标识符中很重要.:-)