Elixir - Cuerdas

Las cadenas de Elixir se insertan entre comillas dobles y están codificadas en UTF-8. A diferencia de C y C ++, donde las cadenas predeterminadas están codificadas en ASCII y solo son posibles 256 caracteres diferentes, UTF-8 consta de 1.112.064 puntos de código. Esto significa que la codificación UTF-8 consta de muchos caracteres posibles diferentes. Dado que las cadenas usan utf-8, también podemos usar símbolos como: ö, ł, etc.

Crear una cadena

Para crear una variable de cadena, simplemente asigne una cadena a una variable:

str = "Hello world"

Para imprimir esto en su consola, simplemente llame al IO.puts función y pasarle la variable str -

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

El programa anterior genera el siguiente resultado:

Hello World

Cadenas vacías

Puede crear una cadena vacía utilizando el literal de cadena, "". Por ejemplo,

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

El programa anterior genera el siguiente resultado.

a is an empty string

Interpolación de cadenas

La interpolación de cadenas es una forma de construir un nuevo valor de cadena a partir de una combinación de constantes, variables, literales y expresiones al incluir sus valores dentro de una cadena literal. Elixir admite la interpolación de cadenas, para usar una variable en una cadena, al escribirla, envuélvala con llaves y anteponga las llaves con una'#' firmar.

Por ejemplo,

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

Esto tomará el valor de x y lo sustituirá por y. El código anterior generará el siguiente resultado:

X-men Apocalypse

Concatenación de cadenas

Ya hemos visto el uso de la concatenación de cadenas en capítulos anteriores. El operador '<>' se usa para concatenar cadenas en Elixir. Para concatenar 2 cadenas,

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

El código anterior genera el siguiente resultado:

Dark Knight

Longitud de la cuerda

Para obtener la longitud de la cadena, usamos el String.lengthfunción. Pasa la cadena como parámetro y te mostrará su tamaño. Por ejemplo,

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

Cuando se ejecuta el programa anterior, produce el siguiente resultado:

5

Inversión de una cuerda

Para invertir una cadena, pásala a la función String.reverse. Por ejemplo,

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

El programa anterior genera el siguiente resultado:

rixilE

Comparación de cadenas

Para comparar 2 cadenas, podemos usar los operadores == o ===. Por ejemplo,

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

El programa anterior genera el siguiente resultado:

Hello world and Hello elixir are not the same.

Coincidencia de cadenas

Ya hemos visto el uso del operador de coincidencia de cadenas = ~. Para comprobar si una cadena coincide con una expresión regular, también podemos usar el operador de coincidencia de cadena o String.match? función. Por ejemplo,

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

El programa anterior genera el siguiente resultado:

true 
false

Esto mismo también se puede lograr usando el operador = ~. Por ejemplo,

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

El programa anterior genera el siguiente resultado:

true

Funciones de cadena

Elixir admite una gran cantidad de funciones relacionadas con cadenas, algunas de las más utilizadas se enumeran en la siguiente tabla.

No Señor. Función y su finalidad
1

at(string, position)

Devuelve el grafema en la posición de la cadena utf8 dada. Si la posición es mayor que la longitud de la cadena, devuelve nil

2

capitalize(string)

Convierte el primer carácter de la cadena dada a mayúsculas y el resto a minúsculas

3

contains?(string, contents)

Comprueba si la cadena contiene alguno de los contenidos dados.

4

downcase(string)

Convierte todos los caracteres en la cadena dada a minúsculas

5

ends_with?(string, suffixes)

Devuelve verdadero si la cadena termina con alguno de los sufijos dados

6

first(string)

Devuelve el primer grafema de una cadena utf8, nulo si la cadena está vacía

7

last(string)

Devuelve el último grafema de una cadena utf8, nulo si la cadena está vacía

8

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

Devuelve una nueva cadena creada al reemplazar ocurrencias de patrón en el sujeto con reemplazo

9

slice(string, start, len)

Devuelve una subcadena que comienza en el inicio del desplazamiento y de longitud len

10

split(string)

Divide una cadena en subcadenas en cada aparición de espacios en blanco Unicode con los espacios en blanco iniciales y finales ignorados. Los grupos de espacios en blanco se tratan como una sola aparición. Las divisiones no ocurren en espacios en blanco que no se rompen

11

upcase(string)

Convierte todos los caracteres en la cadena dada a mayúsculas

Binarios

Un binario es solo una secuencia de bytes. Los binarios se definen usando<< >>. Por ejemplo:

<< 0, 1, 2, 3 >>

Por supuesto, esos bytes se pueden organizar de cualquier manera, incluso en una secuencia que no los convierte en una cadena válida. Por ejemplo,

<< 239, 191, 191 >>

Las cadenas también son binarios. Y el operador de concatenación de cadenas<> es en realidad un operador de concatenación binario:

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

El código anterior genera el siguiente resultado:

<< 0, 1, 2, 3 >>

Tenga en cuenta el carácter ł. Dado que está codificado en utf-8, esta representación de caracteres ocupa 2 bytes.

Dado que cada número representado en un binario está destinado a ser un byte, cuando este valor sube de 255, se trunca. Para evitar esto, usamos el modificador de tamaño para especificar cuántos bits queremos que tome ese número. Por ejemplo

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

El programa anterior generará el siguiente resultado:

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

También podemos usar el modificador utf8, si un carácter es un punto de código, se producirá en la salida; más los bytes -

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

El programa anterior genera el siguiente resultado:

Ā

También tenemos una función llamada is_binaryque comprueba si una variable dada es binaria. Tenga en cuenta que solo las variables que se almacenan como múltiplos de 8 bits son binarios.

Bitstrings

Si definimos un binario usando el modificador de tamaño y le pasamos un valor que no es múltiplo de 8, terminamos con una cadena de bits en lugar de un binario. Por ejemplo,

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

El programa anterior genera el siguiente resultado:

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

Esto significa que la variable bsno es un binario sino más bien una cadena de bits. También podemos decir que un binario es una cadena de bits donde el número de bits es divisible por 8. La coincidencia de patrones funciona tanto en binarios como en cadenas de bits de la misma manera.