3.11. Łańcuchy znakowe
Łańcuchy znakowe (napisy) są reprezentowane przez klasę java.lang.String. Literały łańcuchów znakowych zapisuje się w pojedynczych lub potrójnych cudzysłowach. W literałach znajdujących się w pojedynczych cudzysłowach można stosować sekwencje ucieczki i sekwencje Unicode. Poniższe przykłady zawierają literały łańcuchów znakowych.
scala> val o: String = "abc" o: String = abc scala> val p: String = """abc""" p: String = abc
scala> val q: String = "\tabcde\txyz\t123" q: String = " abcde xyz 123" scala> val r: String = " \"abc\" " r: String = " "abc" " scala> val s: String = "\u0040\u007e" s: String = @~
Literał łańcucha znakowego znajdujący się w pojedynczych cudzysłowach powinien zakończyć się w tym samym wierszu, w którym się zaczął.
scala> val t = "abc\nxyz"
t: String =
abc
xyz
scala> val u = "abc
<console>:1: error: unclosed string literal
val u = "abc
^
scala>
Literały ograniczone z obu stron trzema znakami cudzysłowu mogą zawierać znaki nowego wiersza. Sekwencje ucieczki nie są w takich literałach rozpoznawane, a więc ciągi w postaci znaku \ i kodu znaku (np. ciągi \b i \t) są interpretowane jako dwa następujące po sobie zwykłe znaki (np. \n oznacza znak \ oraz występujący po nim znak n). Można natomiast stosować sekwencje Unicode.
scala> val x: String = """ "abc" """
x: String = " "abc" "
scala> val y: String = """line1
| line2
| line3"""
y: String =
line1
line2
line3
scala> val z: String = """\u0040\n"""
z: String = @\n
Łańcuchy znakowe można łączyć za pomocą operacji dodawania.
scala> p + t res0: String = abcabc xyz
Jeszcze innym rodzajem łańcucha znakowego jest tak zwany łańcuch przetwarzany. Zapisuje się go poprzedzając literał łańcucha (ograniczony pojedynczymi lub potrójnymi cudzysłowami) jakimś identyfikatorem. Interpretacja łańcucha przetwarzanego zależy od użytego identyfikatora. Standardowo Scala udostępnia trzy takie identyfikatory: s, f oraz raw, ale można samodzielnie definiować dodatkowe (co zostanie opisane w podrozdziale 20.8). Przetwarzane łańcuchy mogą zawierać poprzedzone znakiem dolara $ i ewentualnie ujęte w nawiasy klamrowe odwołania do zmiennych, wartości niezmiennych i wyrażeń. Takie wyrażenia będziemy nazywać interpolowanymi. Oto przykłady przetwarzanych łańcuchów poprzedzonych identyfikatorem s.
scala> var name = "Paul"
name: String = Paul
scala> s"Hello $name!"
res1: String = Hello Paul!
scala> s"Two plus two gives ${2+2}"
res2: String = Two plus two gives 4
Wynikiem wyrażenia zawierającego przetwarzany łańcuch poprzedzony identyfikatorem s jest zwykły łańcuch znakowy zawierający tekstowe reprezentacje interpolowanych wartości. Poza tym łańcuchy takie zachowują się podobnie do zwykłych łańcuchów ograniczonych pojedynczymi znakami cudzysłowu: sekwencje ucieczki i znaki Unicode są interpretowane tak, jak w zwykłych łańcuchach. Dzieje się tak również w przypadku ograniczenia łańcucha przetwarzanego potrójnymi znakami cudzysłowu.
scala> s"""Hello\n${name}\u0021"""
res3: String =
Hello
Paul!
Przetwarzany łańcuch znakowy możemy poprzedzić identyfikatorem raw. W takim przypadku wartości interpolowane są również wstawiane w postaci tekstowej, ale sekwencje ucieczki nie są interpretowane.
scala> raw"Hello\n${name}\u0021"
res4: String = Hello\nPaul!
Trzecim rodzajem standardowego identyfikatora, którym możemy poprzedzić przetwarzany łańcuch jest f. Łańcuchy nim poprzedzone mogą po interpolowanej wartości zawierać specyfikację określającą jak wartość wyrażenia ma być zamieniona na łańcuch znakowy. Specyfikacja wykorzystuje format zdefiniowany dla metody String.format. Na przykład następujący łańcuch znakowy zawiera dwa interpolowane wyrażenia — jedno sformatowane jako liczba całkowita z wiodacymi zerami, a drugie jako liczba zmiennoprzecinkowa z dwoma miejscami po przecinku.
scala> f"${1+2+3}%04d ${Math.PI}%.2f"
res5: String = 0006 3,14
![]() | Separator cyfr dziesiętnych — tu przecinek — może być inny na komputerze czytelnika. |
![]() | Specyfikacja języka Scala opisuje klasę String w punkcie 12.3.1, a jej literały w punkcie 1.3.5. |


