Podstawy ciągów znaków: konkatenacja i długość
Proszę używać .. do konkatenacji, # do określania długości oraz string.rep/reverse.
Podstawy ciągów znaków: konkatenacja i długość to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.
Łączenie tekstów za pomocą ..
Lua używa .. (dwóch kropek) do łączenia tekstów. Operator działa z tekstami i liczbami (liczby są konwertowane automatycznie). W przeciwieństwie do operatora + w wielu językach, + w Lua służy wyłącznie do działań arytmetycznych — użycie + dla tekstów powoduje błąd.
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 stringOperator długości #
Operator # zwraca długość tekstu w bajtach. W przypadku tekstów ASCII jest ona równa liczbie znaków. Dla wielobajtowych tekstów UTF-8 operator # zlicza bajty, a nie znaki — emoji UTF-8 zajmuje 4 bajty. Aby uzyskać długość dokładną co do znaków, należy użyć biblioteki 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 97string.rep i string.reverse
string.rep(s, n, sep) powtarza tekst s dokładnie n razy, używając opcjonalnego separatora. string.reverse(s) odwraca kolejność bajtów tekstu. Obie funkcje zwracają nowe teksty — teksty w Lua są niezmienne.
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")) -- 54321string.upper i string.lower
string.upper(s) i string.lower(s) konwertują znaki ASCII. Nie obsługują Unicode — znaki spoza ASCII pozostają niezmienione. Aby porównywać teksty bez uwzględniania wielkości liter, należy przed porównaniem zamienić oba teksty na małe litery.
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()) -- trueSkładnia metod z dwukropkiem
Funkcje tekstowe można wywoływać za pomocą składni z dwukropkiem dla wartości tekstowych: s:upper() zamiast string.upper(s). Działa to dlatego, że teksty mają metatabelę z __index = string, dzięki czemu wszystkie funkcje biblioteki tekstowej są dostępne jako metody dowolnego tekstu.
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()) -- AULNiezmienność tekstów
Teksty w Lua są niezmienne. Nie można modyfikować ich znaków bezpośrednio. Każda operacja na tekście tworzy nowy tekst. W przypadku intensywnego łączenia tekstów w pętlach należy użyć tabeli do gromadzenia fragmentów, a na końcu wywołać table.concat — jest to znacznie wydajniejsze niż wielokrotne używanie ...
-- 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 endtable.concat do łączenia
table.concat(t, sep, i, j) łączy elementy tablicy w tekst, używając separatora. Działa tylko z wartościami tekstowymi i liczbowymi — tabele lub wartości logiczne powodują błąd. Jest to najszybszy sposób tworzenia tekstów z wielu fragmentów.
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, ","))Porównywanie tekstów
Teksty są porównywane leksykograficznie według wartości bajtów. W ASCII wielkie litery występują przed małymi (A=65, a=97), dlatego "Z" < "a" ma wartość true. Aby sortować bez uwzględniania wielkości liter, należy użyć string.lower po obu stronach porównania.
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 i tonumber
tostring(v) konwertuje dowolną wartość na jej reprezentację tekstową. tonumber(s, base) analizuje tekst i konwertuje go na liczbę. tonumber zwraca nil, jeśli analiza się nie powiedzie, w przeciwieństwie do wielu języków, które zgłaszają wyjątek. Podstawa może mieć wartość od 2 do 36 podczas analizowania liczb całkowitych.
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)Internowanie napisów
Lua internuje krótkie napisy: identyczna zawartość napisów współdzieli ten sam obiekt w pamięci. Dzięki temu porównanie napisów za pomocą == jest w praktyce porównaniem wskaźników po sprawdzeniu skrótu — i działa bardzo szybko. Internowanie oznacza również niewielki narzut podczas tworzenia napisu (obliczenie skrótu), ale wielokrotne użycie tych samych napisów nie wiąże się z dodatkowym kosztem.
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) -- trueSzybkie sprawdzenie
Jaki jest najbardziej wydajny sposób tworzenia długiego napisu z wielu małych fragmentów w Lua?
Podsumowanie: podstawy napisów
Najważniejsze informacje:
..służy do konkatenacji; do napisów nigdy nie należy używać+#szlicza bajty (nie znaki Unicode)s:upper(),s:lower(),s:rep(n, sep),s:reverse()- Napisy są niezmienne — każda operacja zwraca nowy napis
- Duże napisy należy tworzyć za pomocą tabeli i
table.concat tostring/tonumbersłużą do konwersji typów
Często zadawane pytania
Czy lekcja „Podstawy ciągów znaków: konkatenacja i długość” jest bezpłatna?
Tak — pełny tekst „Podstawy ciągów znaków: konkatenacja i długość” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Podstawy ciągów znaków: konkatenacja i długość”?
Proszę używać .. do konkatenacji, # do określania długości oraz string.rep/reverse. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Lua Academy?
Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Podstawy ciągów znaków: konkatenacja i długość”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?
Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy ciągów znaków: konkatenacja i długość
- Wyszukiwanie i wyodrębnianie podciągów
- string.format do formatowania wyjścia
- string.gsub i string.gmatch