5.2.1. Řetězcové konstanty (literály)

Řetezcové konstnty jsou v zásadě dvojího druhu: expandující (interpolující) a neexpandující (neinterpolující). Uvnitř expandujících dochází k nahrazení posloupnosti #{varname} hodnotou proměnné varname a rovněž se používá znak '\' pro vkládání řídicích i jiných znaků. Uvnitř neexpandujících se neprovádí interpolace (expanze) řetěžců začínajících znakem '#' a '\' je omezeno jen na dvě posloupnosti \\ a \'.

Nejdříve tedy popíši neexpandující řetězce (řetězcové konstanty). Tyto jsou začínají a končí znakem apostrof '. Zápis se může rozprostírat i přes několik řádků. V takovém případě je znak konce řádku součástí řetězce.

retezec = 'První řádek.
Druhá řádek.'
irb(main):001:0> retezec = 'První řádek.
irb(main):002:0' Druhý řádek.'
=> "Prvn\303\255 \305\231\303\241dek.\nDruh\303\275 \305\231\303\241dek."
irb(main):003:0> puts retezec
První řádek.
Druhý řádek.
=> nil

Pokud potřebujeme v řetězci použít znak ', můžeme jej označit pomocí zpětného lomítka. Větu "I'm ready." zapíšeme

irb(main):005:0> veta = 'I\'m ready.'
=> "I'm ready."
irb(main):006:0> puts veta
I'm ready.
=> nil

Znak obráceného lomítka má před jiným znakem obráceného lomítka také speciální význam. Je to proto, abychom mohli zapsat \'.

irb(main):007:0> s = '\\\''
=> "\\'"
irb(main):008:0> s = '\\'
=> "\\"

Expandující (interpolující) řetězce expandují (interpolují) větší sadu znaků. Jednak je to již zmíněné obrácené lomítko pomocí kterého lzě zadávat řídicí posloupnosti jako \n \a \b \f … a expanze proměnných pomocí #.

Tabulka 5.1. Použití obráceného lomítka pro zápis znaků

posloupnostvýznam
\x Obrácené lomítko před znakem x mění význam je-li to jeden ze znaků: abcefnrstuvxCM01234567\#"
\aASCII kód 7 (BEL). Stejné jako \C-g nebo \007.
\bASCII kód 8 (BackSpace). Stejné jako \C-h nebo \010.
\eASCII kód 27 (ESC). Stejné jako \033.
\fASCII kód 12 (FF). Stejné jako \C-l nebo \014.
\nASCII kód 10 (NewLine). Stejné jako \C-j nebo \012.
\rASCII kód 13 (CR). Stejné jako \C-m nebo \015.
\sASCII kód 32 (SP). Vkládá mezeru, tedy stejné jako " ".
\tASCII kód 9 (TAB). Stejné jako \C-i nebo \011.
\unnnnUnikódový znak vyjádřený čtyřmi hexadecimálními číslicemi n. Podporováno v Ruby 1.9 a vyšším.
\u{hexa}Unikódový znak vyjádřený hexadecimálním číslem hexa. Ruby 1.9 a novější.
\vASCII kód 11 (VT). Stejné jako \C-k nebo \013.
\nnnASCII znak jehož oktalový kód je nnn.
\nnStejné jako \0nn.
\nStejné jako \00n.
\xnnASCII znak jehož hexadecimální kód je nn.
\xnStejné jako \x0n.
\cxZkratka pro \C-x
\C-xZnak jenž má v ASCII reprezentaci nejvyšší dva bity v bajtu nastaveny na 0.
\M-xZnak jenž má v ASCII reprezentaci nejvyšší bit v bajtu nastaven na 1. \M může být kombinováno s \C.
\EOLLomítko na konci řádku spojuje řádek s následujícím. Tedy posloupnost \ a znak konce řádku je odstraněna.

Expandující jsou například:

"řetězec se substitucí #{var}"
%Q/řetězec.../
%Q:řetězec...:

Neexpandující pak:

'řetězec'
%q[taky řetězec]
%q(samozřejmě řetězec)
%q!už mě to přestává bavit!

Jak jste si na ukázkách mohli všimnout, mimo obvyklé znaky pro uvození řetězců " a ' je možnou použít %q formu. Malé q pro neexpandující a velké Q pro expandující řetězce. V tomto tvaru je řetězec vymezen znakem jenž následuje jako první za písmenem q(Q). Výjimkou jsou znaky (, [ a { k nimž je odpovídající koncový znak ), ], nebo }.

Zvláštní formou jsou pak víceřádkové řetězcové konstanty. Tyto mají tvar

var = <<"EOS"
Toto je víceřádkový řetězec
se substitucí. Hodnota Proměnné
var je #{var}
EOS
irb(main):001:0> pozdrav = <<TADY + <<TAM + "World"
irb(main):002:0" Hello
irb(main):003:0" TADY
irb(main):004:0" There
irb(main):005:0" TAM
=> "Hello\nThere\nWorld"
irb(main):006:0> puts pozdrav
Hello
There
World
=> nil

U víceřádkových řetězcových konstant je prováděna substituce. Pokud chceme substituci potlačit, použijeme

# $Id: string-literal-eof2.ses,v 1.1 2003/01/14 13:37:57 radek Exp $
var = <<'EOS'
variable #{a}
EOS
"variable \#{a}\n"
p var
"variable \#{a}\n"
nil

Ukončovací značka víceřádkového řetězce musí být na začátku řádku. Protože nám to ne vždy vyhovuje, má ruby ješte variantu u které tato značka může být kdekoliv, ale na samostatném řádku.

a = <<-EOF
Toto je víceřádkový řetězec
ukončený značkou EOF na samostatném řádku.
Všiměte si, že značka není na začátku řádku.
    EOF
Licence Creative Commons
Tento dokument Ruby, jehož autorem je Radek Hnilica, podléhá licenci Creative Commons Uveďte autora-Nevyužívejte dílo komerčně-Zachovejte licenci 3.0 Česká republika .