Elisir - Archi

Le stringhe in Elixir vengono inserite tra virgolette doppie e sono codificate in UTF-8. A differenza di C e C ++ in cui le stringhe predefinite sono codificate ASCII e sono possibili solo 256 caratteri diversi, UTF-8 è costituito da 1.112.064 punti di codice. Ciò significa che la codifica UTF-8 consiste di quei molti diversi caratteri possibili. Poiché le stringhe usano utf-8, possiamo anche usare simboli come: ö, ł, ecc.

Crea una stringa

Per creare una variabile stringa, è sufficiente assegnare una stringa a una variabile -

str = "Hello world"

Per stamparlo sulla tua console, chiama semplicemente il file IO.puts e passagli la variabile str -

str = str = "Hello world" 
IO.puts(str)

Il programma di cui sopra genera il seguente risultato:

Hello World

Stringhe vuote

Puoi creare una stringa vuota usando la stringa letterale, "". Per esempio,

a = ""
if String.length(a) === 0 do
   IO.puts("a is an empty string")
end

Il programma di cui sopra genera il seguente risultato.

a is an empty string

Interpolazione di stringhe

L'interpolazione di stringhe è un modo per costruire un nuovo valore String da una combinazione di costanti, variabili, letterali ed espressioni includendo i loro valori all'interno di una stringa letterale. Elixir supporta l'interpolazione delle stringhe, per usare una variabile in una stringa, quando la si scrive, racchiuderla tra parentesi graffe e anteporre le parentesi graffe con un'#' cartello.

Per esempio,

x = "Apocalypse" 
y = "X-men #{x}"
IO.puts(y)

Questo prenderà il valore di x e lo sostituirà in y. Il codice sopra genererà il seguente risultato:

X-men Apocalypse

Concatenazione di stringhe

Abbiamo già visto l'uso della concatenazione di stringhe nei capitoli precedenti. L'operatore "<>" viene utilizzato per concatenare le stringhe in Elixir. Per concatenare 2 stringhe,

x = "Dark"
y = "Knight"
z = x <> " " <> y
IO.puts(z)

Il codice sopra genera il seguente risultato:

Dark Knight

Lunghezza della stringa

Per ottenere la lunghezza della stringa, usiamo il String.lengthfunzione. Passa la stringa come parametro e ti mostrerà la sua dimensione. Per esempio,

IO.puts(String.length("Hello"))

Quando si esegue il programma sopra, produce il seguente risultato:

5

Inversione di una stringa

Per invertire una stringa, passarla alla funzione String.reverse. Per esempio,

IO.puts(String.reverse("Elixir"))

Il programma di cui sopra genera il seguente risultato:

rixilE

Confronto tra stringhe

Per confrontare 2 stringhe, possiamo usare gli operatori == o ===. Per esempio,

var_1 = "Hello world"
var_2 = "Hello Elixir"
if var_1 === var_2 do
   IO.puts("#{var_1} and #{var_2} are the same")
else
   IO.puts("#{var_1} and #{var_2} are not the same")
end

Il programma di cui sopra genera il seguente risultato:

Hello world and Hello elixir are not the same.

Corrispondenza delle stringhe

Abbiamo già visto l'uso dell'operatore di corrispondenza stringa = ~. Per verificare se una stringa corrisponde a una regex, possiamo anche utilizzare l'operatore di corrispondenza della stringa o String.match? funzione. Per esempio,

IO.puts(String.match?("foo", ~r/foo/))
IO.puts(String.match?("bar", ~r/foo/))

Il programma di cui sopra genera il seguente risultato:

true 
false

Lo stesso può essere ottenuto anche utilizzando l'operatore = ~. Per esempio,

IO.puts("foo" =~ ~r/foo/)

Il programma di cui sopra genera il seguente risultato:

true

Funzioni stringa

Elixir supporta un gran numero di funzioni legate alle stringhe, alcune delle più utilizzate sono elencate nella tabella seguente.

Sr.No. Funzione e suo scopo
1

at(string, position)

Restituisce il grafema nella posizione della stringa utf8 data. Se la posizione è maggiore della lunghezza della stringa, restituisce zero

2

capitalize(string)

Converte il primo carattere della stringa data in maiuscolo e il resto in minuscolo

3

contains?(string, contents)

Controlla se la stringa contiene uno dei contenuti forniti

4

downcase(string)

Converte tutti i caratteri nella stringa data in minuscolo

5

ends_with?(string, suffixes)

Restituisce vero se la stringa termina con uno dei suffissi forniti

6

first(string)

Restituisce il primo grafema da una stringa utf8, nil se la stringa è vuota

7

last(string)

Restituisce l'ultimo grafema da una stringa utf8, nullo se la stringa è vuota

8

replace(subject, pattern, replacement, options \\ [])

Restituisce una nuova stringa creata sostituendo le occorrenze del modello nel soggetto con sostituzione

9

slice(string, start, len)

Restituisce una sottostringa a partire dall'inizio dell'offset e di lunghezza len

10

split(string)

Divide una stringa in sottostringhe in ogni occorrenza di spazio vuoto Unicode con spazi iniziali e finali ignorati. I gruppi di spazi vengono trattati come una singola occorrenza. Le divisioni non si verificano su spazi bianchi univoci

11

upcase(string)

Converte in maiuscolo tutti i caratteri nella stringa data

Binari

Un binario è solo una sequenza di byte. I binari vengono definiti utilizzando<< >>. Per esempio:

<< 0, 1, 2, 3 >>

Naturalmente, quei byte possono essere organizzati in qualsiasi modo, anche in una sequenza che non li rende una stringa valida. Per esempio,

<< 239, 191, 191 >>

Anche le stringhe sono binari. E l'operatore di concatenazione di stringhe<> è in realtà un operatore di concatenazione binaria:

IO.puts(<< 0, 1 >> <> << 2, 3 >>)

Il codice sopra genera il seguente risultato:

<< 0, 1, 2, 3 >>

Notare il carattere ł. Poiché questo è codificato utf-8, questa rappresentazione di caratteri occupa 2 byte.

Poiché ogni numero rappresentato in un binario deve essere un byte, quando questo valore sale da 255, viene troncato. Per evitare ciò, usiamo il modificatore di dimensione per specificare quanti bit vogliamo che quel numero prenda. Ad esempio:

IO.puts(<< 256 >>) # truncated, it'll print << 0 >>
IO.puts(<< 256 :: size(16) >>) #Takes 16 bits/2 bytes, will print << 1, 0 >>

Il programma sopra genererà il seguente risultato:

<< 0 >>
<< 1, 0 >>

Possiamo anche usare il modificatore utf8, se un carattere è un punto di codice, verrà prodotto nell'output; altrimenti i byte -

IO.puts(<< 256 :: utf8 >>)

Il programma di cui sopra genera il seguente risultato:

Ā

Abbiamo anche una funzione chiamata is_binaryche controlla se una data variabile è un binario. Notare che solo le variabili memorizzate come multipli di 8 bit sono binari.

Bitstrings

Se definiamo un binario usando il modificatore di dimensione e gli passiamo un valore che non è un multiplo di 8, finiamo con una stringa di bit invece di un binario. Per esempio,

bs = << 1 :: size(1) >>
IO.puts(bs)
IO.puts(is_binary(bs))
IO.puts(is_bitstring(bs))

Il programma di cui sopra genera il seguente risultato:

<< 1::size(1) >>
false
true

Ciò significa che la variabile bsnon è un binario ma piuttosto una stringa di bit. Possiamo anche dire che un binario è una stringa di bit in cui il numero di bit è divisibile per 8. Il pattern matching funziona allo stesso modo su binari e stringhe di bit.