Кавычки
Для определения строк используются "двойные кавычки", 'одинарные кавычки'
и [[двойные квадратные скобки]]
и [[двойные квадратные скобки]]
> = "hello"
hello
> = 'hello'
hello
> = [[hello]]
hello
Зачем же так много способов? Ну можно, к примеру, вложить одни кавычки в другие и т.д.
> = 'hello "Lua user"'
hello "Lua user"
> = "Its [[content]] hasn't got a substring."
Its [[content]] hasn't got a substring.
> = [[Let's have more "strings" please.]]
Let's have more "strings" please.
Двойные квадратные скобки тоже имеют свои особенности. О них будет написано ниже.
Управляющие последовательности
Строки, заключённые в кавычки, могут интерпретировать C-подобные управляющие последовательности (escape-последовательности), начинающиеся с символа "\" (обратный слэш):
- \b (пробел)
- \n (переход на новую строку)
- \r (возврат каретки)
- \t (горизонтальная табуляция)
- \v (вертикальная табуляция)
- \\ (обратный слеш)
- \'' (двойная кавычка)
- \' (одинарная кавычка)
> = "hello \"Lua user\""
hello "Lua user"
> = 'hello\nNew line\tTab'
hello
New line Tab
Управляющие последовательности не распознаются, когда используются двойные квадратные скобки:
> = [[hello\nNew line\tTab]]
hello\nNew line\tTab
Многострочный текст
Двойные квадратные скобки используются для определения текста на нескольких строках:
> = [[Multiple lines of text
>> can be enclosed in double square
>> brackets.]]
Multiple lines of text
can be enclosed in double square
brackets.
Вложенные кавычки
В двойные квадратные скобки можно вкладывать другие, но в этом случае необходимо вписать один или несколько знаков = после первой и перед последними квадратными скобками. Не важно сколько знаков равенства вы напишите, главное, что их кол-во совпадало:
> = [[one [[two]] one]] -- не пойдёт
stdin:1: nesting of [[...]] is deprecated near '['
> = [=[one [[two]] one]=] -- а так пойдёт
one [[two]] one
> = [===[one [[two]] one]===] -- и так пойдёт
one [[two]] one
> = [=[one [ [==[ one]=] -- всё в порядке, не обращаем внимание на"внутренности"
one [ [==[ one
Соединение
Строки можно соединять вместе, используя оператор .. (две точки)
> = "hello" .. " Lua user"
hello Lua user
> who = "Lua user"
> = "hello "..who
hello Lua user
Можно соединять строки с числами. В этом случае числа будут приведены к строковому типу:
> = "Green bottles: "..10
Green bottles: 10
> = type("Green bottles: "..10)
string
Использование большого числа соединений может работать медленно, т.к. при соединении выделяется память под новую строку. Парочка примеров:
-- медленный вариант
local s = ''
for i=1,10000 do s = s .. math.random() .. ',' end
io.stdout:write(s)
-- быстрый вариант
for i=1,10000 do io.stdout:write(tostring(math.random()), ',') end
-- тоже быстро, но требует больше памяти
local t = {}
for i=1,10000 do t[i] = tostring(math.random()) end
io.stdout:write(table.concat(t,','), ',')
Также в Lua есть стандартная строковая библиотека.
Парочка примеров:
Парочка примеров:
> = string.byte("ABCDE", 2) -- возвращает ASCII значение второго символа
66
> = string.char(65,66,67,68,69) -- возвращает строку по ASCII значению
ABCDE
> = string.find("hello Lua user", "Lua") -- ищет подстроку "Lua"
7 9
> = string.find("hello Lua user", "l+") -- ищет один или несколько стоящих рядом "l"
3 4
> = string.format("%.7f", math.pi) --формат числа
3.1415927
> = string.format("%8s", "Lua") -- формат строки
Lua
Приведение типов данных
Lua автоматически выполняет приведение чисел к строкам и наоборот, там где это нужно.
> = "This is Lua version " .. 5.1 .. " we are using."
This is Lua version 5.1 we are using.
> = "Pi = " .. math.pi
Pi = 3.1415926535898
> = "Pi = " .. 3.1415927
Pi = 3.1415927
Как видно выше при приведение типов нельзя контролировать формат строки. Это можно исправить, воспользовавшись функцией string.format()
> = string.format("%.3f", 5.1)
5.100
> = "Lua version " .. string.format("%.1f", 5.1)
Lua version 5.1
данная статья является вольным переводом с сайта lua-users.org
с возможными дополнениями и изменениями
с возможными дополнениями и изменениями