Aleksey2093 | Дата: Среда, 18.03.2015, 17:41 | Сообщение # 1 |
Подполковник
Группа: Администраторы
Сообщений: 116
Статус: Offline
| Под строкам, как и обычно, подразумевают последовательность символов. Lua является полностью 8-битным, соответственно строки могут содержать символы с любым числовым значением, включая встроенные нули (?!!!). Это значит, что вы можете хранить любые двоичные данные в строках. Строки в Lua содержат неизменяемые значения. Вы не можете изменить символ в строке, как это делали в С; вместо этого, вы создаете новую строку с желаемыми изменениями, как показано в следующем примере:
a = "one string" b = string.gsub(a, "one", "another") -- изменение части строки print(a) --> one string print(b) --> another string Как и другие объекты Lua, строки являются субъектами автоматического управления памятью. Это значит. что вам не нужно беспокоиться о выделении памяти для строк и последующим ее освобождении; Lua сделает это за вас. Строка может содержать одну букву, а может - целую книгу. Lua достаточно эффективно работает с длинными строками. Программы на Lua, работающие со строками размером 100K или 1M символов - достаточно обычное явление.
Строки в Lua могут ограничиваться как двойными, так и одинарными кавычками:
a = "a line" b = 'another line' Использование определенного вида кавычек (одинарных или двойных) является лишь вопросом стиля и ваших личных привычек и предпочтений, за исключением использования кавычек внутри строки; в этом случае кавычки должны либо иметь закрывающую пару, либо предваряться обратным слэшем.
Следующие примеры иллюстрируют вышесказанное:
> print("one line\nnext line\n\"in quotes\", 'in quotes'") one line next line "in quotes", 'in quotes' > print('a backslash inside quotes: \'\\\'') a backslash inside quotes: '\' > print("a simpler way: '\\'") a simpler way: '\' Также можно задавать символ в строке его числовым значением, используя escape-последовательность \ddd, где ddd - последовательность не более трех десятичных цифр. В качестве примера - строки "alo\n123\"" и '\97lo\10\04923"' абсолютно равнозначны, т.к. в системе, использующей ASCII: 97 - ASCII-код английской буквы a, 10 - код перевода строки, а 49 (\049 в примере) - код цифры 1.
Также строки можно выделять парными сдвоенными квадратными скобками [[...]]. Строки, выделенные таким образом могут начинаться в любом месте и могут быть вложенными в другие строки, т.к. двойные квадратные скобки не интерпретируются как управляющая последовательность. Более того, в таких строках игнорируется первый символ, если это символ перевода строки. Такая форма особенно удобна для написания строк, содержащих участки кода; например, write(page) Lua осуществляет автоматическое преобразование между строками и числами во время выполнения. В случае применения числовых операций к строкам, Lua пытается преобразовать строку в число:
print("10" + 1) --> 11 print("10 + 1") --> 10 + 1 print("-5.3e-10"*"2") --> -1.06e-09 print("hello" + 1) -- ERROR (cannot convert "hello") Lua применяет такое приведение не только в арифметических операциях, но и в других местах, где ожидается число. И обратно, если число встречается там, где ожидается строка, Lua преобразует число в строку: print(10 .. 20) --> 1020 (Конкатенация строк в Lua осуществляется оператором ... В случае помещения оператора после числа, необходимо разделять их пробелом; в противном случае, Lua воспринимает первую точку как десятичную). Если не принимать в расчет описанное автоматическое преобразование, строки и числа являются совершенно разными вещами. Сравнение типа 10 == "10" всегда будет возвращать false (Ложь), т.к. 10 - число, а "10" - строка. Если необходимо явно преобразовать строку в число, используется функция tonumber, возвращающая nil в случае невозможности преобразования:
line = io.read() -- чтение строки n = tonumber(line) -- попытка преобразования в число if n == nil then error(line .. " is not a valid number") else print(n*2) end Для преобразования числа в строку применяется функция tostring или конкатенация числа с пустой строкой:
print(tostring(10) == "10") --> true print(10 .. "" == "10") --> true Подобные преобразования всегда истинны.
|
|
| |