0Pricing
Lua Academy · Урок

Основы строк: объединение и длина

Используйте .. для объединения строк, # для определения длины, а также string.rep и reverse.

«Основы строк: объединение и длина» — бесплатный урок Lua Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Объединение строк с помощью ..

В Lua для объединения строк используется .. (две точки). Оператор работает со строками и числами (числа преобразуются автоматически). В отличие от + во многих языках, + в Lua предназначен только для арифметики — его использование со строками вызывает ошибку.

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

Оператор длины #

Оператор # возвращает длину строки в байтах. Для строк в кодировке ASCII это совпадает с количеством символов. Для многобайтных строк UTF-8 оператор # считает байты, а не символы — эмодзи в UTF-8 занимает 4 байта. Для точного подсчёта символов используйте библиотеку UTF-8.

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 и string.reverse

string.rep(s, n, sep) повторяет строку s ровно n раз, используя необязательный разделитель. string.reverse(s) обращает порядок байтов строки. Обе функции возвращают новые строки — строки Lua неизменяемы.

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 и string.lower

string.upper(s) и string.lower(s) преобразуют символы ASCII. Они не обрабатывают Unicode — символы, отличные от ASCII, остаются без изменений. Для сравнения без учёта регистра преобразуйте обе строки в lower перед сравнением.

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

Синтаксис методов с двоеточием

Функции для работы со строками можно вызывать с помощью синтаксиса с двоеточием у строковых значений: s:upper() вместо string.upper(s). Это работает, потому что у строк есть метатаблица с __index = string, поэтому все функции библиотеки строк доступны как методы любой строки.

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

Неизменяемость строк

Строки Lua неизменяемы. Нельзя изменить отдельные символы на месте. Каждая операция со строкой создаёт новую строку. При интенсивном объединении строк в циклах используйте таблицу для накопления частей, а в конце — table.concat; это значительно эффективнее, чем многократное использование ...

-- 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 для объединения

table.concat(t, sep, i, j) объединяет элементы массива в строку с разделителем. Функция работает только со строковыми и числовыми значениями — таблицы и логические значения вызывают ошибку. Это самый быстрый способ собрать строку из множества частей.

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, ","))

Сравнение строк

Строки сравниваются лексикографически по значениям байтов. В ASCII прописные буквы идут перед строчными (A=65, a=97), поэтому выражение "Z" < "a" истинно. Для упорядочивания без учёта регистра используйте string.lower с обеих сторон сравнения.

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 и tonumber

tostring(v) преобразует любое значение в его строковое представление. tonumber(s, base) преобразует строку в число. Если преобразование не удаётся, tonumber возвращает nil — в отличие от многих языков, где возникает исключение. При разборе целых чисел основание может быть от 2 до 36.

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)

Интернирование строк

Lua интернирует короткие строки: одинаковое содержимое строк использует один и тот же объект в памяти. Поэтому сравнение строк с помощью == после проверки хеша фактически сводится к сравнению указателей — это очень быстро. При интернировании создание строки требует небольших дополнительных затрат на вычисление хеша, но повторное использование уже существующих строк не требует затрат.

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

Быстрая проверка

Как в Lua наиболее эффективно создать длинную строку из множества небольших частей?

Итоги: основы строк

Основные моменты:

  • .. объединяет строки; никогда не используйте + для строк
  • #s подсчитывает байты, а не символы Unicode
  • s:upper(), s:lower(), s:rep(n, sep), s:reverse()
  • Строки неизменяемы — каждая операция возвращает новую строку
  • Создавайте большие строки с помощью таблицы и table.concat
  • tostring/tonumber используются для преобразования типов

Часто задаваемые вопросы

Урок «Основы строк: объединение и длина» бесплатный?

Да — полный текст урока «Основы строк: объединение и длина» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Основы строк: объединение и длина»?

Используйте .. для объединения строк, # для определения длины, а также string.rep и reverse. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Основы строк: объединение и длина»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы строк: объединение и длина
  2. Поиск и извлечение подстрок
  3. string.format для вывода
  4. string.gsub и string.gmatch
← Назад к Lua Academy