Comparación estricta con ===

Entre distintos tipos de datos también se pueden usar operadores de comparación, pero las reglas son un poco diferentes. Mira esto para ver el orden completo: https://hexdocs.pm/elixir/operators.html#term-ordering. Además, con el operador estricto (===) puedes también asegurar que ambos operandos numéricos son del mismo tipo (Integer o Float).

Cuando trabajamos con comparaciones en Elixir, nos encontramos con algunas particularidades interesantes que vale la pena entender para evitar confusiones. Por ejemplo, comparar números entre sí o átomos entre sí es algo que hacemos con naturalidad, pero ¿qué ocurre si intentamos comparar un número con un átomo? A simple vista, parece que no tendría sentido, ya que son tipos de datos diferentes.

Sin embargo, Elixir nos permite hacer estas comparaciones, aunque el resultado puede ser sorprendente. Si usamos el operador de igualdad simple == para comparar, por ejemplo, el número 3 con el flotante 3.0, Elixir nos devuelve true. Esto se debe a que, aunque uno es un entero y el otro un flotante, el lenguaje considera que representan el mismo valor numérico. Así, 3 == 3.0 es verdadero porque el valor es equivalente, sin importar el tipo.

Pero si queremos ser más estrictos y que la comparación tenga en cuenta también el tipo de dato, debemos usar el operador de igualdad estricta ===. Este operador exige que tanto el valor como el tipo coincidan. Por eso, 3 === 3.0 devuelve false, ya que uno es un entero y el otro un flotante.

Además, existe el operador de desigualdad estricta !==, que devuelve true cuando los valores o los tipos no coinciden. Por ejemplo, 3 !== 3.0 es true porque aunque el valor numérico es el mismo, los tipos son diferentes. También devuelve true si los valores son distintos aunque los tipos coincidan.

3 == 3.0    # true
3 === 3.0   # false
3 !== 3.0   # true
3 !== 4     # true

Volviendo a la comparación entre tipos muy diferentes, como un número y un átomo, Elixir tiene un orden interno para comparar distintos tipos de datos. Aunque a primera vista no parezca lógico, este orden permite que podamos hacer comparaciones como 5 < :ola y obtener un resultado válido. En este caso, Elixir considera que los números son siempre menores que los átomos, por lo que 5 < :ola devuelve true, mientras que 5 > :ola devuelve false.

Si invertimos la comparación, por ejemplo :ola > 5, también obtenemos true porque los átomos se consideran mayores que los números. Este comportamiento puede parecer extraño, pero es útil en ciertas situaciones donde necesitamos ordenar o comparar datos heterogéneos.

Para entender mejor este orden, podemos consultar la documentación oficial de Elixir, donde se detalla cómo se ordenan los distintos tipos de datos internamente. En resumen, los números están por debajo de los átomos en esta jerarquía, lo que explica los resultados de estas comparaciones.

5 < :ola    # true
5 > :ola    # false
:ola > 5    # true

Así, al trabajar con comparaciones en Elixir, es importante tener en cuenta no solo el valor, sino también el tipo de dato y el orden interno que el lenguaje asigna a cada tipo. Esto nos ayudará a evitar sorpresas y a escribir código más preciso y predecible.

Lista de reproducción
  1. 1
    ¿Qué es Elixir?
    10 minutos
  2. 2
    Instalación de Elixir
    9 minutos
  3. 3
    ¿Qué es la programación funcional? (Como la de Elixir)
    20 minutos
  4. 4
    ¿Cómo funciona la REPL de Elixir?
    7 minutos
  5. 5
    ¿Cómo hacer asignaciones en Elixir?
    7 minutos
  6. 6
    Operadores aritméticos básicos
    6 minutos
  7. 7
    ¿Qué son los tipos de datos de Elixir?
    5 minutos
  8. 8
    Átomos en Elixir
    4 minutos
  9. 9
    Las palabras clave nil, true y false
    6 minutos
  10. 10
    Operadores lógicos de comparación
    8 minutos
  11. 11
    Comparación estricta con ===
    3 minutos
  12. 12
    Operadores lógicos y proposicionales
    8 minutos
  13. 13
    Invocación de funciones
    10 minutos
  14. 14
    Fundamentos de funciones
    9 minutos
  15. 15
    Cadenas de caracteres
    8 minutos
  16. 16
    Entrada y salida estandar de la mano de gets y puts
    9 minutos
  17. 17
    Concatenar e interpolar strings
    9 minutos
  18. 18
    Código fuente en archivos
    9 minutos
  19. 19
    Condicional IF y bloques DO-END
    11 minutos
  20. 20
    IFs anidados, UNLESS y COND
    12 minutos
  21. 21
    Definición de funciones
    11 minutos
  22. 22
    Fundamentos de compilación de módulos
    6 minutos
  23. 23
    Guardas
    8 minutos
  24. 24
    Funciones anónimas
    7 minutos
  25. 25
    Capturar funciones
    4 minutos
  26. 26
    Invocación de funciones dentro del mismo módulo
    7 minutos
  27. 27
    Tuplas
    8 minutos
  28. 28
    Introducción al pattern matching
    8 minutos
  29. 29
    Pattern matching en funciones
    11 minutos
  30. 30
    Las tuplas :ok, :error
    7 minutos
  31. 31
    case
    10 minutos
  32. 32
    Operador pin
    7 minutos
  33. 33
    Pattern matchings y recursividad
    5 minutos
  34. 34
    Listas
    9 minutos
  35. 35
    Operadores y funciones de lista
    10 minutos
  36. 36
    Keyword lists: listas de palabras clave
    8 minutos
  37. 37
    Mapas
    7 minutos
  38. 38
    Pattern matching de mapas y keyword lists
    6 minutos
  39. 39
    Operadores y funciones para mapas y keyword lists
    5 minutos
  40. 40
    Estructuras con defstruct
    11 minutos
  41. 41
    Bitstrings
    11 minutos
  42. 42
    Charlists
    10 minutos
  43. 43
    Funciones de alto orden en Elixir
    5 minutos
  44. 44
    Uso de la función filter
    10 minutos
  45. 45
    Uso de la función map
    7 minutos
  46. 46
    Uso de la función reduce
    9 minutos
  47. 47
    Pipelines
    11 minutos
  48. 48
    Rangos y Streams
    11 minutos
  49. 49
    Funciones recursivas con listas
    14 minutos