2.4 - Строки

Под строкам, как и обычно, подразумевают последовательность символов. 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
Подобные преобразования всегда истинны.
Hosted by uCoz