Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Sztring és bináris

Sztring (String, double quoted)

Az idézőjelek közé írt sztring UTF-8 kódolású karakterek ábrázolása bájtok sorozataként, azaz bináris típusú érték. Ennek két következménye van:

  • az UTF-8 kódolás miatt a sztring (karakterekben mért) hossza kisebb lehet az őt ábrázoló bináris (bájtokban mért) hosszánál;
  • a lista- és a sztringműveletek különbözőek.
iex> dxdy = "δx/δy"
"δx/δy"

iex> {String.length(dxdy), byte_size(dxdy)}
{5, 7}

iex> {String.at(dxdy,0), String.codepoints(dxdy)}
{"δ", ["δ", "x", "/", "δ", "y"]}

iex> [dx, dy] = String.split(dxdy, "/")
["δx", "δy"]

iex> dx <> "/" <> dy # <>: konkatenálás
"δx/δy"

A δ két bájton tárolódik, ezért az öt karakterből álló sztring hét bájt. A String modul függvényeit a Műveletek sztringeken fejezet tárgyalja.

Ami közös a karakterláncban és a sztringben

A karakterlánc és a sztring is UTF-8 kódolású karakterekből áll, és mindkettőben lehetnek ún. escape-szekvenciák:

\aBEL (0x07)\bBS (0x08)\dDEL (0x7f)
\eESC (0x1b)\fFF (0x0c)\nNL (0x0a)
\rCR (0x0d)\sSP (0x20)\tTAB (0x09)
\vVT (0x0b)\uhhhhUnicode codepoint in hexadecimal
\xhhsingle byte in hexadecimal

Néhány karakter speciális jelentését az elé írt \ megszünteti, pl. \\ maga a visszaper-jel.

Mindkettő megengedi az ún. interpolációt, azaz egy kifejezés helyettesítését az értékével: "...#{<expr>}...".

iex> name = "dávid" # Sztring
"dávid"

iex> "Helló, #{String.capitalize name}!"
"Helló, Dávid!"

iex> bubo = 'Bubo' # Karakterlánc
~c"Bubo"

iex> "Helló, #{List.to_string [bubo, ? , "Réka"]}!"
"Helló, Bubo Réka!"

Az utolsó példában a ? (kérdőjel és szóköz) a szóköz karakter kódja; a List.to_string/1 a karakterláncból, a kódból és a sztringből álló listát egyetlen sztringgé alakítja.

Bináris (Binary)

A bináris típusba tartozó értékek bitsorozatok. Egy bináris érték jelölése << kif, ... >> alakú. A legegyszerűbb kif a [0,255] tartományba eső egész szám; a számokat bájtként tároljuk a binárisban:

iex> b = << 1, 2, 3 >>
<<1, 2, 3>>

iex> {byte_size(b), bit_size b}
{3, 24}

A tárolásra használt bitek száma a ::size(n) módosítóval megszabható. Az alábbi példában az 1 két biten (01), a második 1 három biten (001) tárolódik, együtt az öt bites 01001, ami decimálisan 9:

iex> b = << 1::size(2), 1::size(3) >> # 01 001
<<9::size(5)>> # = 9 (decimálisként)

iex> {byte_size(b), bit_size b}
{1, 5}

Egész és lebegőpontos számok és más értékek is tárolhatók binárisan. Itt a <<2.5>> a 2.5 lebegőpontos szám 64 bites ábrázolása:

iex> << <<1>> :: binary, <<2.5>> :: binary >>
<<1, 64, 4, 0, 0, 0, 0, 0, 0>>

A bináris tárolás hasznos médiafájlok és UTF-8 karakterek tárolására, processzek közötti kommunikációban stb.

Forrás: dp26a-fp2ea.pdf (13–15. dia)