Elixir - Strings

Łańcuchy w Elixirze są umieszczane między podwójnymi cudzysłowami i kodowane w UTF-8. W przeciwieństwie do C i C ++, gdzie domyślne ciągi znaków są zakodowane w formacie ASCII i możliwe jest tylko 256 różnych znaków, UTF-8 składa się z 1 112 064 punktów kodowych. Oznacza to, że kodowanie UTF-8 składa się z wielu różnych możliwych znaków. Ponieważ łańcuchy używają utf-8, możemy również używać symboli takich jak: ö, ł itp.

Utwórz ciąg

Aby utworzyć zmienną łańcuchową, po prostu przypisz ciąg do zmiennej -

str = "Hello world"

Aby wydrukować to na konsoli, po prostu zadzwoń do IO.puts funkcji i przekaż jej zmienną str -

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

Powyższy program generuje następujący wynik -

Hello World

Puste ciągi

Możesz utworzyć pusty ciąg używając literału ciągu, "". Na przykład,

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

Powyższy program generuje następujący wynik.

a is an empty string

Interpolacja ciągów

Interpolacja ciągów to sposób na skonstruowanie nowej wartości typu String z kombinacji stałych, zmiennych, literałów i wyrażeń poprzez uwzględnienie ich wartości wewnątrz literału ciągu. Elixir obsługuje interpolację ciągów znaków, aby użyć zmiennej w ciągu znaków, podczas pisania owiń ją nawiasami klamrowymi i poprzedź nawiasy klamrowe znakiem'#' znak.

Na przykład,

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

To przyjmie wartość x i zastąpi ją y. Powyższy kod wygeneruje następujący wynik -

X-men Apocalypse

Konkatenacja ciągów

W poprzednich rozdziałach widzieliśmy już użycie konkatenacji ciągów. Operator „<>” służy do łączenia ciągów w Elixirze. Aby połączyć 2 ciągi,

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

Powyższy kod generuje następujący wynik -

Dark Knight

Długość łańcucha

Aby uzyskać długość ciągu, używamy String.lengthfunkcjonować. Przekaż ciąg jako parametr, a pokaże ci jego rozmiar. Na przykład,

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

Uruchomienie powyższego programu daje następujący wynik -

5

Odwracanie ciągu

Aby odwrócić ciąg, przekaż go do funkcji String.reverse. Na przykład,

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

Powyższy program generuje następujący wynik -

rixilE

Porównanie ciągów

Aby porównać 2 ciągi, możemy użyć operatorów == lub ===. Na przykład,

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

Powyższy program generuje następujący wynik -

Hello world and Hello elixir are not the same.

Dopasowywanie ciągów

Widzieliśmy już użycie operatora dopasowania łańcuchów = ~. Aby sprawdzić, czy ciąg pasuje do wyrażenia regularnego, możemy również użyć operatora dopasowania ciągu lub parametru String.match? funkcjonować. Na przykład,

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

Powyższy program generuje następujący wynik -

true 
false

To samo można również osiągnąć za pomocą operatora = ~. Na przykład,

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

Powyższy program generuje następujący wynik -

true

Funkcje łańcuchowe

Elixir obsługuje dużą liczbę funkcji związanych z napisami, niektóre z najczęściej używanych są wymienione w poniższej tabeli.

Sr.No. Funkcja i jej cel
1

at(string, position)

Zwraca grafem w pozycji podanego łańcucha utf8. Jeśli pozycja jest większa niż długość łańcucha, zwraca nil

2

capitalize(string)

Konwertuje pierwszy znak w danym ciągu na wielką, a resztę na małe

3

contains?(string, contents)

Sprawdza, czy ciąg zawiera dowolną z podanych treści

4

downcase(string)

Konwertuje wszystkie znaki w danym ciągu na małe litery

5

ends_with?(string, suffixes)

Zwraca prawdę, jeśli łańcuch kończy się dowolnym z podanych przyrostków

6

first(string)

Zwraca pierwszy grafem z łańcucha utf8, nil, jeśli łańcuch jest pusty

7

last(string)

Zwraca ostatni grafem z łańcucha utf8, nil, jeśli łańcuch jest pusty

8

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

Zwraca nowy ciąg utworzony przez zastąpienie wystąpień wzorca w temacie zamiennikiem

9

slice(string, start, len)

Zwraca podciąg rozpoczynający się na początku przesunięcia i o długości len

10

split(string)

Dzieli ciąg na podciągi w każdym wystąpieniu białych znaków Unicode z ignorowaniem wiodących i końcowych białych znaków. Grupy białych znaków są traktowane jako pojedyncze wystąpienie. Podziały nie występują na nierozdzielających białych znakach

11

upcase(string)

Konwertuje wszystkie znaki w podanym ciągu na wielkie litery

Pliki binarne

Binarny to po prostu sekwencja bajtów. Pliki binarne są definiowane za pomocą<< >>. Na przykład:

<< 0, 1, 2, 3 >>

Oczywiście te bajty można zorganizować w dowolny sposób, nawet w kolejności, która nie czyni z nich prawidłowego ciągu. Na przykład,

<< 239, 191, 191 >>

Łańcuchy są również plikami binarnymi. I operator konkatenacji ciągów<> jest w rzeczywistości operatorem konkatenacji binarnej:

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

Powyższy kod generuje następujący wynik -

<< 0, 1, 2, 3 >>

Zwróć uwagę na znak ł. Ponieważ jest to zakodowane w formacie UTF-8, ta reprezentacja znaków zajmuje 2 bajty.

Ponieważ każda liczba reprezentowana w postaci binarnej ma być bajtem, gdy ta wartość wzrośnie z 255, jest obcinana. Aby temu zapobiec, używamy modyfikatora rozmiaru, aby określić, ile bitów ma zająć ta liczba. Na przykład -

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

Powyższy program wygeneruje następujący wynik -

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

Możemy również użyć modyfikatora utf8, jeśli znak jest punktem kodowym, zostanie wygenerowany na wyjściu; inaczej bajty -

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

The above program generates the following result −

Ā

We also have a function called is_binary that checks if a given variable is a binary. Note that only variables which are stored as multiples of 8bits are binaries.

Bitstrings

If we define a binary using the size modifier and pass it a value that is not a multiple of 8, we end up with a bitstring instead of a binary. For example,

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

The above program generates the following result −

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

This means that variable bs is not a binary but rather a bitstring. We can also say that a binary is a bitstring where the number of bits is divisible by 8. Pattern matching works on binaries as well as bitstrings in the same way.