|
Программирование на 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 |
|