Java 文本块:缩进前缀中混合制表符和空格
Java Text Blocks: Mix of Tabs and Spaces within Indentation Prefixes
Java 15 introduced(非预览)文本块功能。
它允许通过剥离 普通白色 space 前缀 来定义多行字符串文字 而不会破坏代码缩进, 从行。 JEP 378.
中描述了该算法
但是,在使用制表符和 spaces 混合缩进的情况下,“普通白色 space 前缀”究竟是如何定义的?
例如,以下情况下的字符串值是什么(·
表示 space,→
表示制表符):
→ → ····String text = """
→ → ····→ line1
→ ········→ line2
→ ····→ → """;
使用 OpenJDK 进行的简单测试显示结果字符串为:
line1
··→ line2
所以看起来 Javac 只计算白色 space 符号,包括 spaces 和制表符,并使用计数 - 处理 spaces (0x20)和制表符 (0x09) 同样。这是预期的行为吗?
旁注:这不是一个纯理论问题;它对于具有混合 spaces/tabs 缩进和大型代码库的项目具有实际意义。
我找到了想要分享的答案。
Java 编译器确实平等对待空格、制表符和所有其他 whitespace characters .
因此从每一行中删除相同的 数量 的(任何)空白字符。
详情:
javac
tokenizer uses the String.stripIndent()
method,其中有如下实现说明:
This method treats all white space characters as having equal width. As long as the indentation on every line is consistently composed of the same character sequences, then the result will be as described above.
Java 15 introduced(非预览)文本块功能。 它允许通过剥离 普通白色 space 前缀 来定义多行字符串文字 而不会破坏代码缩进, 从行。 JEP 378.
中描述了该算法但是,在使用制表符和 spaces 混合缩进的情况下,“普通白色 space 前缀”究竟是如何定义的?
例如,以下情况下的字符串值是什么(·
表示 space,→
表示制表符):
→ → ····String text = """ → → ····→ line1 → ········→ line2 → ····→ → """;
使用 OpenJDK 进行的简单测试显示结果字符串为:
line1 ··→ line2
所以看起来 Javac 只计算白色 space 符号,包括 spaces 和制表符,并使用计数 - 处理 spaces (0x20)和制表符 (0x09) 同样。这是预期的行为吗?
旁注:这不是一个纯理论问题;它对于具有混合 spaces/tabs 缩进和大型代码库的项目具有实际意义。
我找到了想要分享的答案。
Java 编译器确实平等对待空格、制表符和所有其他 whitespace characters .
因此从每一行中删除相同的 数量 的(任何)空白字符。
详情:
javac
tokenizer uses the String.stripIndent()
method,其中有如下实现说明:
This method treats all white space characters as having equal width. As long as the indentation on every line is consistently composed of the same character sequences, then the result will be as described above.