Ř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 retezecPrvní řá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 vetaI'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ů
posloupnost | význam |
---|---|
\
| Obrácené lomítko před znakem x mění význam je-li to jeden ze znaků: abcefnrstuvxCM01234567\#" |
\a | ASCII kód 7 (BEL). Stejné jako \C-g nebo \007 . |
\b | ASCII kód 8 (BackSpace). Stejné jako \C-h nebo \010 . |
\e | ASCII kód 27 (ESC). Stejné jako \033 . |
\f | ASCII kód 12 (FF). Stejné jako \C-l nebo \014 . |
\n | ASCII kód 10 (NewLine). Stejné jako \C-j nebo \012 . |
\r | ASCII kód 13 (CR). Stejné jako \C-m nebo \015 . |
\s | ASCII kód 32 (SP). Vkládá mezeru, tedy stejné jako " ". |
\t | ASCII kód 9 (TAB). Stejné jako \C-i nebo \011 . |
\u | Unikódový znak vyjádřený čtyřmi hexadecimálními číslicemi n . Podporováno v Ruby 1.9 a vyšším. |
\u{ | Unikódový znak vyjádřený hexadecimálním číslem hexa . Ruby 1.9 a novější. |
\v | ASCII kód 11 (VT). Stejné jako \C-k nebo \013 . |
\ | ASCII znak jehož oktalový kód je nnn . |
\ | Stejné jako \0 . |
\ | Stejné jako \00 . |
\x | ASCII znak jehož hexadecimální kód je nn . |
\x | Stejné jako \x0 . |
\c | Zkratka pro \C-x |
\C- | Znak jenž má v ASCII reprezentaci nejvyšší dva bity v bajtu nastaveny na 0. |
\M- | Znak jenž má v ASCII reprezentaci nejvyšší bit v bajtu nastaven na 1. \M může být kombinováno s \C . |
\ EOL | Lomí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 pozdravHello 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