原始字符串中的换行符是否与平台相关?

问题描述 投票:0回答:3

原始字符串中的换行符是否与平台相关?

val a = "one\ntwo";

val b = """one
two"""

println(a == b)

换句话说,上面的

println
语句是否保证打印
true

string kotlin cross-platform line-breaks rawstring
3个回答
1
投票

不幸的是,我找不到任何具体说明这一点的消息来源。感觉像是应该在文档中的东西。

但是,IntelliJ 中存在将原始字符串转换为普通字符串的意图操作。我认为可以安全地假设此操作不应改变代码的含义(或者如果改变了,则应将其作为错误提交)。如果您在包含换行符的原始字符串上尝试此操作,您可以看到它用

\n
字符替换了换行符。

您可以在here查看操作的来源,以及对其进行的测试,期望它将换行符转换为

\n
here(之前)here(之后)


编辑:这里是对有关原始字符串问题的评论,(据我所知)指出原始字符串中有

\n
行结尾。


0
投票

我不认为它保证

a
b
相等。 Spec 对于原始字符串文字有这样的说法:

Kotlin 有两种类型的字符串文字:其中可能包含转义字符的转义字符串和可以包含换行符和任意文本的原始字符串。

  1. 规格没有说是一样的
  2. 该规范区分了“换行符”和“任意文本”
  3. 在@zsmb13 指向 Kotlin 讨论的链接中,一位 Kotlin 工程师表示编译器不会保留原始字符串中的换行符 (??)。

因此,如果我要编写跨平台工作的代码,我会很明确(至少在他们这样做之前)。


0
投票

这似乎是故意的,因为它仅编译为换行符。 此论坛帖子和 Roman Elizarov 的回复评论澄清了这一点。

 """    
 -first line    
 -second line 
 """.trimIndent() ```

编译为

"-first line\n-secondline"

而不是

”-第一行 -第二行”

这是设计使然吗?有没有关于line的官方文档 三引号字符串中的分隔符?

回应:

是的。设计就是如此。有一个关键要求,即代码的行为不应依赖于编译它的平台。 ...

该线程的后续操作是 KT-56021,这是记录此案例的问题:

KT-56021:文档:提及多行字符串始终使用 NL 分隔符,无论平台如何。

© www.soinside.com 2019 - 2024. All rights reserved.