简体   繁体   中英

Multi-line string literals behave sane only in REPL and Worksheet

REPL:

scala> val a = "hello\nworld"
a: String = 
hello
world

scala> val b = """hello
     | world"""
b: String = 
hello
world

scala> a == b
res0: Boolean = true

Worksheet:

val a = "hello\nworld"                        //> a  : String = hello
                                              //| world

val b = """hello
world"""                                      //> b  : String = hello
                                              //| world

a == b                                        //> res0: Boolean = true

Normal Scala code:

val a = "hello\nworld"

val b = """hello
world"""

println(a)
println(b)
println(a == b)

Output:

hello
world
hello
world
false

Why does the comparison yield true in the REPL and in the Worksheet, but false in normal Scala code?


Interesting, b appears to be one char longer than a , so I printed the Unicode values:

println(a.map(_.toInt))
println(b.map(_.toInt))

Output:

Vector(104, 101, 108, 108, 111, 10, 119, 111, 114, 108, 100)
Vector(104, 101, 108, 108, 111, 13, 10, 119, 111, 114, 108, 100)

Does that mean multi-line string literals have platform-dependent values? I use Eclipse on Windows.

I guess it's because of the source file encoding .

Try to check a.toList.length and b.toList.length . It seems b == "hello\\r\\nworld" .

Multi-line string literal value depends not on the platform, but on the encoding of the source file. Actually you'll get exactly what you have in the source file between """ . If there is \\r\\n you'll get it in your String .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM