0Pricing
Lua Academy · Lección

Coerción y conversión de tipos

Aprenda la coerción automática entre cadenas y números, y las conversiones explícitas con tonumber/tostring.

Coerción y conversión de tipos es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué es la coerción de tipos?

La coerción de tipos es la conversión automática de un valor de un tipo a otro cuando el contexto lo requiere. Lua realiza coerciones en dos direcciones específicas: de cadena a número en contextos aritméticos y de número a cadena en contextos de concatenación.

A diferencia de JavaScript, la coerción de Lua es limitada y predecible. No convierte automáticamente valores booleanos en números ni tablas en cadenas.

-- String to number (arithmetic context)
print("10" + 5)     -- 15  (coerced)
print("3.14" * 2)   -- 6.28

-- Number to string (concatenation context)
print(10 .. "px")   -- 10px
print(3.14 .. "!")  -- 3.14!

-- No boolean coercion
-- print(true + 1)  -- ERROR!

Reglas de coerción de cadena a número

Cuando aparece una cadena en una expresión aritmética, Lua intenta convertirla en un número. Si la cadena no representa un número válido, se produce un error en tiempo de ejecución. Entre las cadenas numéricas válidas se incluyen los enteros ("42"), los números de punto flotante ("3.14"), los valores hexadecimales ("0xff") y la notación científica ("1e3").

Se aceptan las cadenas con espacios en blanco al principio o al final; Lua los elimina durante la coerción.

print("42" + 0)      -- 42    (integer)
print("3.14" + 0)    -- 3.14  (float)
print("0xff" + 0)    -- 255   (hex)
print("  10  " + 0)  -- 10    (whitespace ok)
print("1e3" + 0)     -- 1000.0

-- This will error:
-- print("hello" + 0)  -- attempt to perform arithmetic on a string value

Coerción de número a cadena

Al concatenar un número con .., Lua convierte automáticamente el número en una cadena. Los enteros se convierten en su representación decimal; los números de punto flotante pueden incorporar decimales. Para controlar con precisión el formato, utilice siempre tostring() o string.format() en lugar de depender de la coerción implícita.

print(10 .. "!")       -- 10!
print(3.14 .. "!")     -- 3.14!
print(1/3 .. "!")      -- 0.33333333333333!

-- Explicit is better for precision
print(string.format("%.2f", 1/3))  -- 0.33
print(tostring(10))                -- 10
print(tostring(10.0))              -- 10.0

tonumber(): conversión explícita

tonumber(v) convierte explícitamente un valor en un número. Devuelve el número convertido si la operación tiene éxito, o nil si la conversión falla; nunca produce un error. Puede especificarse una base opcional (2–36) para analizar enteros, lo que permite conversiones binarias, octales y hexadecimales.

Compruebe siempre si el valor devuelto por tonumber() es nil al procesar datos introducidos por el usuario.

print(tonumber("42"))      -- 42
print(tonumber("3.14"))    -- 3.14
print(tonumber("0xFF"))    -- 255
print(tonumber("hello"))   -- nil (no error!)
print(tonumber(true))      -- nil

-- Base conversion
print(tonumber("ff", 16))  -- 255
print(tonumber("11", 2))   -- 3   (binary)
print(tonumber("77", 8))   -- 63  (octal)

tostring(): conversión explícita

tostring(v) convierte cualquier valor en una cadena. Para los números, produce una cadena decimal o en notación científica. Para los valores booleanos, produce "true" o "false". Para nil, devuelve "nil". Para tablas y funciones, devuelve una dirección como "table: 0x...", a menos que se haya definido un metamétodo __tostring.

print(tostring(42))         -- 42
print(tostring(3.14))       -- 3.14
print(tostring(true))       -- true
print(tostring(false))      -- false
print(tostring(nil))        -- nil
print(tostring({}))         -- table: 0x...

-- Useful for safe concatenation
local val = nil
local msg = "Value: " .. tostring(val)
print(msg)   -- Value: nil

math.tointeger()

math.tointeger(x) (Lua 5.3 o posterior) convierte un número de punto flotante en un entero solo si el valor tiene una representación entera exacta. Si la conversión implicaría perder precisión, devuelve nil. Es más seguro que math.floor(), que siempre tiene éxito, pero puede truncar silenciosamente.

Utilícelo cuando necesite validar estrictamente un entero, por ejemplo, al trabajar con API que requieren enteros exactos.

print(math.tointeger(5.0))   -- 5   (exact)
print(math.tointeger(5.5))   -- nil (not exact)
print(math.tointeger(2^53))  -- 9007199254740992

-- Contrast with math.floor
print(math.floor(5.9))       -- 5   (truncates)
print(math.floor(5.0))       -- 5

-- Check before use
local n = math.tointeger(val) or error("need integer")

Coerción en las comparaciones

Lua no realiza coerción de tipos en las comparaciones de igualdad. 1 == "1" siempre es false porque los operandos tienen tipos diferentes. Sin embargo, los operadores relacionales (<, >, etc.) sí activan la coerción entre cadenas y números, pero solo si ambos operandos son del mismo tipo. Mezclar tipos en comparaciones de orden produce un error.

print(1 == "1")    -- false (no coercion)
print(1 == 1.0)    -- true  (int/float equal)

-- Ordering: same type only
print("abc" < "abd")  -- true (string compare)
print(1 < 2)          -- true (number compare)

-- This ERRORS: mixing string and number
-- print(1 < "2")  -- attempt to compare number with string

Práctica: analizar datos introducidos por el usuario

Un patrón muy habitual en los programas de Lua consiste en leer una cadena introducida por el usuario (por ejemplo, mediante io.read()) y convertirla en un número. Utilice siempre tonumber() y compruebe si devuelve nil para gestionar correctamente los datos no válidos en lugar de provocar un fallo.

-- Safe input parsing pattern
local function parseNumber(input)
  local n = tonumber(input)
  if n == nil then
    return nil, "Invalid number: " .. tostring(input)
  end
  return n, nil
end

local val, err = parseNumber("42")
print(val, err)   -- 42  nil

local val2, err2 = parseNumber("abc")
print(val2, err2) -- nil  Invalid number: abc

Problemas de precisión de enteros y números de punto flotante

Los números de punto flotante tienen una precisión limitada. Las operaciones que mezclan enteros y números de punto flotante pueden producir resultados inesperados debido a la representación IEEE 754. El entero máximo que puede representarse exactamente como un número double es 2^53 = 9,007,199,254,740,992. Los enteros mayores pierden precisión al almacenarse como números de punto flotante.

En Lua 5.3 o posterior, los enteros nativos de 64 bits admiten valores exactos de hasta 2^63-1, un límite mucho mayor. Utilice siempre aritmética entera cuando la exactitud sea importante.

-- Float precision limit
print(2^53)            -- 9.007...e+15
print(2^53 + 1 == 2^53) -- true (precision lost!)

-- Integer stays exact
local big = math.maxinteger
print(big)             -- 9223372036854775807
print(math.type(big))  -- integer

-- Mixing promotes to float
print(math.type(1 + 1.0))  -- float

Conversiones de formato de cadenas

string.format() es la herramienta más potente para convertir números en cadenas cuando necesita controlar la precisión, el relleno y la notación. Sigue los especificadores de formato de printf de C. Utilícela para mostrar datos, escribir archivos y en cualquier situación en la que la representación predeterminada de tostring() no sea suficiente.

print(string.format("%d", 255))      -- 255
print(string.format("%x", 255))      -- ff
print(string.format("%05d", 42))     -- 00042
print(string.format("%.2f", 3.14159)) -- 3.14
print(string.format("%e", 12345.0))  -- 1.234500e+04
print(string.format("%s=%d", "x", 10)) -- x=10

Comprobación rápida

¿Qué devuelve tonumber("hello") en Lua?

Recapitulación: coerción y conversión de tipos

Lo aprendido:

  • Lua convierte automáticamente cadenas en números en operaciones aritméticas y números en cadenas al concatenar
  • tonumber() devuelve nil si falla; ¡compruebe siempre el resultado!
  • tostring() convierte cualquier valor en una cadena de forma segura
  • La igualdad (==) nunca realiza coerción; los tipos diferentes nunca son iguales
  • Utilice string.format() para dar formato preciso a los números
  • El límite de precisión de los números de punto flotante es 2^53; utilice enteros nativos para valores grandes exactos

Siguiente: control del flujo con if/elseif/else y bucles.

Preguntas frecuentes

¿La lección «Coerción y conversión de tipos» es gratis?

Sí — el texto completo de «Coerción y conversión de tipos» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Coerción y conversión de tipos»?

Aprenda la coerción automática entre cadenas y números, y las conversiones explícitas con tonumber/tostring. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Coerción y conversión de tipos»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Resumen de los tipos de datos de Lua
  2. Declaración de variables en Lua
  3. Operadores aritméticos y relacionales
  4. Coerción y conversión de tipos
← Volver a Lua Academy