0Pricing
Lua Academy · Lekcja

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 string

Operator 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 97

string.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"))   -- 54321

string.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())    -- true

Skł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())  -- AUL

Niezmienność 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 end

table.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)  -- true

Szybkie 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ć +
  • #s zlicza 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/tonumber sł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

  1. Podstawy ciągów znaków: konkatenacja i długość
  2. Wyszukiwanie i wyodrębnianie podciągów
  3. string.format do formatowania wyjścia
  4. string.gsub i string.gmatch
← Powrót do Lua Academy