Cuando trabajamos con cadenas de caracteres en Elixir, lo primero que debemos tener claro es cómo comparar strings. El operador más común para esto es el doble igual ==, que nos permite verificar si dos cadenas son iguales. Por ejemplo, la expresión "hola" == "hola" devuelve true, mientras que si las cadenas son diferentes, el resultado será false. También existe el operador triple igual ===, pero en el caso de las cadenas no presenta diferencias significativas con el doble igual, por lo que podemos usar cualquiera de los dos con tranquilidad.
Lo interesante es que estas comparaciones no solo funcionan con literales, sino también con variables o incluso con el resultado de funciones. Por ejemplo, si definimos una variable x = "hola" y luego comparamos x == "hola", obtendremos true. Si usamos funciones como String.upcase("hola"), que convierte la cadena a mayúsculas, la comparación con "hola" devolverá false porque las mayúsculas y minúsculas no coinciden. Pero si invertimos la comparación y comparamos String.upcase("hola") == String.upcase(x), el resultado será true porque ambas cadenas están en mayúsculas.
Pasando a la concatenación, en Elixir unimos cadenas usando el operador <>. Aunque puede parecer extraño para quienes vienen de otros lenguajes, este operador funciona juntando la cadena de la izquierda con la de la derecha. Por ejemplo, "hola" <> "mundo" produce "holamundo". Si queremos un espacio entre las palabras, debemos incluirlo explícitamente, como en "hola " <> "mundo". También podemos encadenar varias concatenaciones, por ejemplo:
"hola" <> " " <> "mundo"
Esto nos da "hola mundo". Además, podemos concatenar variables, como si x = "hola" y nombre = "Dani", entonces:
x <> " " <> nombre
resulta en "hola Dani".
Sin embargo, a veces concatenar con <> puede ser un poco engorroso, especialmente cuando queremos insertar valores dentro de una cadena. Para eso, Elixir ofrece la interpolación, que es una forma más elegante de incluir valores dentro de strings. La interpolación consiste en escribir la cadena normalmente y, en el punto donde queremos insertar un valor, usamos #{expresión}. Por ejemplo:
nombre = "Dani"
"Hola #{nombre}"
Esto produce "Hola Dani". Lo potente de la interpolación es que no solo podemos insertar cadenas, sino cualquier expresión. Por ejemplo, podemos usar funciones dentro de la interpolación:
"Hola #{String.capitalize(nombre)}"
Esto convierte la primera letra de nombre en mayúscula y produce "Hola Dani". También podemos interpolar números o átomos sin problema:
numero = 42
"Hola #{numero}"
da como resultado "Hola 42". Y si interpolamos un átomo, como :mundo, se convierte en la cadena "mundo".
Un detalle importante al trabajar con cadenas es cómo manejar caracteres especiales y escapes. Por ejemplo, si queremos incluir un carácter de comillas dentro de una cadena, o un símbolo como el hashtag #, debemos tener cuidado para que Elixir no lo interprete como parte de la sintaxis de interpolación. Para insertar literalmente un # sin que se interprete como interpolación, debemos escaparlo con una barra invertida \. Por ejemplo:
"Esto es un \\#literal"
Aquí, la doble barra invertida \\ se interpreta como una barra invertida literal, y el # no se toma como inicio de interpolación.
Otro caso común es cuando queremos incluir barras invertidas en las cadenas, como en rutas de Windows. Si escribimos algo como "C:\notepad", Elixir interpretará \n como un salto de línea, lo que no es lo que queremos. Para evitarlo, debemos escapar la barra invertida con otra barra invertida, así:
"C:\\notepad"
De esta forma, la cadena contiene la barra invertida literal. Esto es especialmente útil en sistemas Windows, donde las rutas usan barras invertidas. Aunque Elixir cuenta con funciones que manejan rutas de forma más segura, es bueno saber cómo escapar estos caracteres manualmente.
En resumen, trabajar con cadenas en Elixir implica entender cómo comparar, concatenar e interpolar strings, y también cómo manejar caracteres especiales mediante escapes para evitar errores o interpretaciones no deseadas. Estos conceptos nos permiten manipular texto de forma flexible y segura en nuestros programas.