0Pricing
Lua Academy · Lección

Conceptos básicos de strings: concatenación y longitud

Utilice .. para concatenar, # para obtener la longitud y string.rep/reverse.

Conceptos básicos de strings: concatenación y longitud es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 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.

Concatenación de cadenas con ..

Lua utiliza .. (dos puntos) para concatenar cadenas. Funciona con cadenas y números (los números se convierten automáticamente). A diferencia de + en muchos lenguajes, + en Lua solo realiza operaciones aritméticas; usar + con cadenas provoca un error.

local first = "Hello"
local second = "World"
print(first .. ", " .. second .. "!")  -- Hello, World!

-- Numbers auto-converted
local age = 30
print("Age: " .. age)   -- Age: 30

-- Bad: print("x" + "y")  ERROR: arithmetic on string

Operador de longitud #

El operador # devuelve la longitud en bytes de una cadena. En las cadenas ASCII, coincide con el número de caracteres. En las cadenas UTF-8 multibyte, # cuenta bytes, no caracteres; un emoji UTF-8 cuenta como 4. Use una biblioteca UTF-8 para obtener longitudes precisas en caracteres.

print(#"hello")        -- 5
print(#"")             -- 0
print(#"café")         -- 5 (c,a,f,é=2bytes)

local s = "Lua"
for i = 1, #s do
  io.write(string.byte(s, i) .. " ")
end
print()  -- 76 117 97

string.rep y string.reverse

string.rep(s, n, sep) repite la cadena s exactamente n veces, con un separador opcional. string.reverse(s) invierte el orden de los bytes de la cadena. Ambas funciones devuelven cadenas nuevas; las cadenas de Lua son inmutables.

print(string.rep("ab", 3))       -- ababab
print(string.rep("ha", 3, "-"))  -- ha-ha-ha
print(string.rep("x", 0))        -- (empty)
print(string.reverse("hello"))   -- olleh
print(string.reverse("12345"))   -- 54321

string.upper y string.lower

string.upper(s) y string.lower(s) convierten los caracteres ASCII. No gestionan Unicode; los caracteres no ASCII se mantienen sin cambios. Para comparar sin distinguir mayúsculas de minúsculas, convierta ambas cadenas a minúsculas antes de compararlas.

print(string.upper("hello"))     -- HELLO
print(string.lower("WORLD"))     -- world
print(string.upper("Lua 5.4!"))  -- LUA 5.4!

-- Case-insensitive comparison
local a = "Hello"
local b = "hello"
print(a:lower() == b:lower())    -- true

Sintaxis de métodos con dos puntos

Las funciones de cadenas pueden llamarse mediante la sintaxis de dos puntos sobre valores de tipo cadena: s:upper() en lugar de string.upper(s). Esto funciona porque las cadenas tienen una metatabla con __index = string, por lo que todas las funciones de la biblioteca de cadenas están disponibles como métodos en cualquier cadena.

local s = "  hello world  "
print(s:upper())         -- HELLO WORLD
print(s:len())           -- 15
print(s:rep(2, "|"))     -- same as string.rep(s,2,"|")

-- Chain calls
print(("lua"):upper():reverse())  -- AUL

Inmutabilidad de las cadenas

Las cadenas de Lua son inmutables. No puede modificar sus caracteres directamente. Cada operación con cadenas crea una cadena nueva. Para realizar muchas concatenaciones dentro de bucles, use una tabla para acumular las partes y table.concat al final; es mucho más eficiente que repetir ...

-- Efficient string building
local parts = {}
for i = 1, 5 do
  parts[i] = "item" .. i
end
local result = table.concat(parts, ", ")
print(result)  -- item1, item2, item3, item4, item5

-- Slow! Creates 5 intermediate strings:
-- local s = ""
-- for i = 1, 5 do s = s .. "item" .. i end

table.concat para unir elementos

table.concat(t, sep, i, j) une elementos de una matriz en una cadena usando un separador. Solo funciona con valores de tipo cadena y número; las tablas o los booleanos provocan un error. Es la forma más rápida de construir cadenas a partir de muchas partes.

local parts = {"one", "two", "three", "four"}
print(table.concat(parts, ", "))          -- one, two, three, four
print(table.concat(parts, " | ", 2, 3))  -- two | three

-- Building CSV
local row = {1, "Alice", 95, true}
-- Need tostring for non-string values:
for i, v in ipairs(row) do row[i] = tostring(v) end
print(table.concat(row, ","))

Comparación de cadenas

Las cadenas se comparan lexicográficamente según el valor de sus bytes. En ASCII, las letras mayúsculas aparecen antes que las minúsculas (A=65, a=97), por lo que "Z" < "a" es verdadero. Use string.lower en ambos lados para ordenar sin distinguir mayúsculas de minúsculas.

print("abc" < "abd")    -- true
print("abc" < "abcd")   -- true (shorter)
print("Z" < "a")        -- true (Z=90, a=97)
print("10" < "9")       -- true (lexicographic!)
print(10 < 9)           -- false (numeric)

-- Sort strings case-insensitively
local words = {"Banana","apple","Cherry"}
table.sort(words, function(a,b) return a:lower()<b:lower() end)
print(table.concat(words,", "))

tostring y tonumber

tostring(v) convierte cualquier valor en su representación de cadena. tonumber(s, base) analiza una cadena y la convierte en un número. tonumber devuelve nil si el análisis falla, a diferencia de muchos lenguajes que lanzan una excepción. La base puede ser de 2 a 36 para analizar enteros.

print(tostring(42))        -- 42
print(tostring(true))      -- true
print(tostring(nil))       -- nil
print(tostring({1,2}))     -- table: 0x...

print(tonumber("3.14"))    -- 3.14
print(tonumber("0xff"))    -- 255 (hex)
print(tonumber("11",2))    -- 3 (binary)
print(tonumber("abc"))     -- nil (invalid)

Internación de cadenas

Lua interna las cadenas cortas: las cadenas con contenido idéntico comparten el mismo objeto en memoria. Esto hace que == aplicado a cadenas sea, en la práctica, una comparación de punteros después de comprobar el hash, lo que resulta muy rápido. La internación también implica un pequeño coste adicional al crear una cadena (el cálculo del hash), pero las cadenas repetidas no tienen coste adicional.

local s1 = "hello"
local s2 = "hel" .. "lo"

-- Same content, interned to same object
print(s1 == s2)   -- true
print(#s1)        -- 5

-- Long strings may not be interned
-- They are still compared correctly by value
local long1 = string.rep("x", 1000)
local long2 = string.rep("x", 1000)
print(long1 == long2)  -- true

Comprobación rápida

¿Cuál es la forma más eficiente de construir una cadena larga a partir de muchas partes pequeñas en Lua?

Repaso: conceptos básicos de las cadenas

Puntos clave:

  • .. concatena; nunca use + con cadenas
  • #s cuenta bytes (no caracteres Unicode)
  • s:upper(), s:lower(), s:rep(n, sep), s:reverse()
  • Las cadenas son inmutables: cada operación devuelve una cadena nueva
  • Construya cadenas grandes con una tabla y table.concat
  • tostring/tonumber para conversiones de tipo

Preguntas frecuentes

¿La lección «Conceptos básicos de strings: concatenación y longitud» es gratis?

Sí — el texto completo de «Conceptos básicos de strings: concatenación y longitud» 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 «Conceptos básicos de strings: concatenación y longitud»?

Utilice .. para concatenar, # para obtener la longitud y string.rep/reverse. 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 1 de 4.

¿Cuánto tiempo toma la lección «Conceptos básicos de strings: concatenación y longitud»?

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. Conceptos básicos de strings: concatenación y longitud
  2. Búsqueda y extracción de substrings
  3. string.format para la salida
  4. string.gsub y string.gmatch
← Volver a Lua Academy