Программирование на Lua | ||
Часть I. Язык Глава 2. Типы и Значения |
Под строкам, как и обычно, подразумевают последовательность символов. 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'Использование определенного вида кавычек (одинарных или двойных) является лишь вопросом стиля и ваших личных привычек и предпочтений, за исключением использования кавычек внутри строки; в этом случае кавычки должны либо иметь закрывающую пару, либо предваряться обратным слэшем. Строки в Lua могут содержать следующий С-подобные управляющие последовательности (escape-последовательности):
\a | звонок |
\b | забой |
\f | подача страницы |
\n | перевод строки |
\r | возврат каретки |
\t | горизонтальная табуляция |
\v | вертикальная табуляция |
\\ | обратный слэш |
\" | двойные кавычки |
\' | одинаоные кавычки |
\[ | левая квадратная скобка |
\] | правая квадратная скобка |
Следующие примеры иллюстрируют вышесказанное:
> 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
.
Также строки можно выделять парными сдвоенными квадратными скобками [[...]]
. Строки, выделенные таким образом могут начинаться в любом месте и могут быть вложенными в другие строки, т.к. двойные квадратные скобки не интерпретируются как управляющая последовательность. Более того, в таких строках игнорируется первый символ, если это символ перевода строки. Такая форма особенно удобна для написания строк, содержащих участки кода; например,
page = [[ <HTML> <HEAD> <TITLE>An HTML Page</TITLE> </HEAD> <BODY> <A HREF="http://www.lua.org">Lua</A> [[a text between double brackets]] </BODY> </HTML> ]] 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Подобные преобразования всегда истинны.
Copyright © 2003-2004 Roberto Ierusalimschy. All rights reserved. | Перевод на русский Artem13 |