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.