Lua/Типы данных: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 53:
Тип string представляет из себя последовательность символов (в других языках программирования символы имеют свой тип - char). Под символами (опять же, в других языках программирования) подразумевается одна буква, например, "l", "u" или "a". Вместе они образуют слово "lua", которое имеет тип string. Но вернемся к Lua: в этом языке нет типа char, а значит любое слово (обрамленное одинарными или двойными кавычками) будет является string.
 
Мы разобрались с тем, что одинарные и двойные кавычки работают только в одной строке. Но как нам разместить многострочный текст? Для этого используются <nowiki>[[ ... ]]</nowiki><syntaxhighlight lang="lua">
Заметим, что sting является неизменяемым типом: вы не можете заменить определенный символ на другой. Тем не менее, вы можете работать над строкой используя функции:<syntaxhighlight lang="lua">
a = "Wiki
books" --> здесь произойдет ошибка
 
a = [[
Wikipedia
and
Wikibooks
]] --> отобразится корректно
</syntaxhighlight>
 
Заметим, что sting является неизменяемым типом: вы не можете заменить определенный символ в строке на другой. Тем не менее, вы можете работать над строкой используя функции:<syntaxhighlight lang="lua">
a = "Wiki Media"
b = string.gsub(a,"Media", "Book") -- Фрагмент, в переменной а, "Media" заменяем на Book
print(b) --> Wiki Book
</syntaxhighlight>Вы можете складывать строки при помощи ..:<syntaxhighlight lang="lua">
print("Wiki" .. "Books") --> WikiBooks
</syntaxhighlight>Часто приходится работать с длинной строки. Чтобы получить длину, можно использовать #переменная:<syntaxhighlight lang="lua">
print(#"Wiki") --> 4
Строка 78 ⟶ 91 :
|
|}
 
=== table ===
Тип table переставляет из себя ассоциативный массив (или словарь, если сравнивать с Python). Под массивом, мы могли бы понимать некий набор переменных. А если же говорить о ассоциативном массиве, то у переменных есть "ассоциация", то есть название, или правильнее - ключ.
 
Чтобы создать тип table надо использовать конструкцию {}:<syntaxhighlight lang="lua">
array = {} --> Только что мы создали пустой массив, в котором ничего нет
</syntaxhighlight>Теперь попробуем добавить какой-нибудь элемент в него:<syntaxhighlight lang="lua">
array = {}
array[1] = 15 --> ключу 1 соответствует значение 15
array["x"] = 89 --> ключу "x" соответствует значение 89
 
 
</syntaxhighlight>Мы добавили в него два элемента. Теперь наша таблица (или массив) содержит два элемента: ключ 1 с значением 15 и ключ "х" с значением 89. Давайте проверим, так ли это:<syntaxhighlight lang="lua">
array[1] --> 15
array["x"] --> 89
</syntaxhighlight>Ранее говорилось, что элементы массива представляют из себя переменные (например, переменная array[1] с ключом 1 и значением 15), а значит, можно работать с ними как с переменными:<syntaxhighlight lang="lua">
Word = {}
Word[1] = "Wiki"
Word[2] = "pedia"
-- Ниже - обычное сложение строк
print(Word[1] .. Word[2]) --> Wikipedia
</syntaxhighlight>Заметим еще важную роль nil в таблицах: если вы не создали элемент массива (например, Word[3]), то его вызов (например, с использованием print()) вернет вам nil. Мы также можем назначит значение nil любому элементу массива, тем самым уничтожив его.
 
Еще одно важное замечание: если вы сделаете ключ типа string, то вы можете иначе вызывать элемент массива, с использованием формы НазваниеМассива.Ключ:<syntaxhighlight lang="lua">
a = {}
a["arr"] = 15
print(a.arr) --> 15
</syntaxhighlight>Хочу заметить, что такой способ можно использовать только когда вы представили ключ в виде строки.<!-- for i = 1, 1000 do a[i] = i*2 end -->
 
== Приведение типов. ==
Как мы говорили ранее, Lua - язык программирования с динамической типизацией. Это значит, что вы можете изменять типы данных для переменной, можете явно не указывать тип данных. Тем не менее, не всегда можно совершать операции над разными типами данных. Мы бы сформулировали следующие правила:
 
# number + number = number: если мы сложим 2+2, то получим 4: <syntaxhighlight lang="lua">
print(5+5) --> 10
</syntaxhighlight>
# string + string = number, если в строке есть цифры: если мы сложим "2" + "2", то получим 4, но мы не можем сложить "Wiki" + "Media"
# Строка не складывается ни с кем, если она содержит буквы: дублирует прошлое правило, то есть, мы не можем сложить "Wiki" + 2
 
Бывают случаи, когда вам надо преобразовать число в строку или наоборот. Для этого используют две функции tonumber() (в число) и tostring() (в строку). Очевидно, что с tostring() проблем возникнуть не должно - мы любое число всегда можем перевести в строку, а вот проблемы с tonumber() могут возникнуть, если мы захотим, к примеру, "Wiki" перевести в число. Именно поэтому, в таких случаях, tonumber() возвращает nil, то есть, ничто, чтобы показать, что это действие выполнить невозможно:<syntaxhighlight lang="lua">
a = tostring(154) --> 154 станет "154"
type(a) --> string
print(a) --> 154 (из строки выше, мы понимаем, что это строка)
 
type(tonumber("154")) --> number
 
tonumber("Wiki") --> nil
</syntaxhighlight>