Главная страница
qrcode

LuaТретье изданиеРоберту Иерузалимски


НазваниеLuaТретье изданиеРоберту Иерузалимски
Дата24.07.2020
Размер2.52 Mb.
Формат файлаpdf
Имя файлаlua.pdf
оригинальный pdf просмотр
ТипДокументы
#42680
страница1 из 28
Каталог
  1   2   3   4   5   6   7   8   9   ...   28
Программирование на языке
Lua
Третье издание
Роберту Иерузалимски
Programming in Lua
Third Edition
Roberto Посвящается Иде, Ноэми и Анне Лучии.

перевод и оформление N1cke
Оглавление







Введение
Когд а Вальд емар, Луис и я начали разработку Lua в 1993 году, мыс трудом могли себе представить, что Lua сможет так распро страниться.
Начавшись как домашний язык для двух специфичных проектов, сейчас широко используется во всех областях, которые могут получить выигрыш от простого, расширяемого, переносимого и эффективного скриптового языка, таких как встроенные системы, мобильные устройства и, конечно, игры.
С самого начала мы разрабатывали Lua для интеграции с программным обеспечением, написанным на
C/C++ и других общепринятых языках. Эта интеграция дает много преимуществ. Lua это крошечный и простой язык, частично из-за того, что он не пытается превзойти Св том, в чем он уже хорош, например высочайшее быстродействие, низкоуровневые операции и взаимодействие со сторонним программным обеспечением. Для этих задач полагается на С. Lua предлагает как раз то, для чего С недостаточно хорош высокая степень независимости от аппаратного обеспечения, динамические структуры, отсутствие избыточности и легкость тестирования и отладки. Для этих целей Lua располагает безопасным окружением,
автоматическим управлением памятью и хорошими средствами для работы со строками и другими видами данных с динамически изменяемым размером.
Часть силы Lua идет от его библиотеки это неслучайно. В конце концов, одной из самых сильных сторон Lua является его расширяемость. Многие качества языка вносят в это свой вклад Динамическая типизация обеспечивает высокую степень полиморфизма.
Автоматическое управление памятью упрощает создание интерфейсов,
по скольку нет необходимости решать, кто отвечает за выделение и освобождение памяти, или как обрабатывать ее переполнение. Функции высшего порядка и анонимные функции обеспечивают высокую степень параметризации, делая функции более универсальными является не только расширяемым, но и связующим языком. Lua поддерживает подход для разработки программного обеспечения на основе компонентов, когда мы создаем приложение, связывая вместе существующие высокоуровневые компоненты. Эти компоненты пишутся на компилируемом языке со статической типизацией, таком как
C или C++; Lua является клеем, который мы используем для компоновки и соединения этих компонентов. Обычно, компоненты (или объекты) представляют более конкретные низкоуровневые сущности (такие как вид жеты и структуры данных, которые почти не меняются вовремя разработки программы, и которые расходуют большую часть процессорного времени итоговой программы.
Lua придает окончательную форму приложению, которая, вероятно, будет неоднократно изменяться вовремя жизненного цикла данной программы. Однако, в отличие отд ругих связующих технологий, Lua при этом является полноценным языком программирования. Поэтому мы можем использовать Lua не только для связывания компонентов, но и для их адаптации и настройки, а также для создания полностью новых компонентов.
Разумеется, Lua — не единственный скриптовый язык. Существуют другие языки, которые вы можете использовать примерно для тех же целей. Тем не менее, Lua предоставляет набор возможностей, которые делают его лучшим выбором для многих ваших задачи которые придают ему свой уникальный профиль:
Расширяемость. Расширяемость настолько значительна, что многие рассматривают Lua не как языка как набор для построения пред метно-ориентированных языков (domain-specific language —
DSL). Мыс самого начала разрабатывали Lua так, чтобы он был расширяемым как через код Lua, таки через код СВ качестве доказательства этой концепции Lua реализует большую часть своей базовой функциональности через внешние библиотеки. Обеспечить взаимодействие с C/C++ действительно простои был успешно интегрирован со многими другими языками, такими как, Java, Smalltalk, Ada, Си даже со скриптовыми языками,
такими как Perl и Простота. Lua — это простой и маленький язык. У него мало концепций (зато они эффективные. Эта простота облегчает изучение Lua и помогает сохранять его размер небольшим. Полный дистрибутив (исходный код , руководство, бинарные файлы для некоторых платформ) спокойно размещается на одном флоппид иске.
Эффективность. Lua обладает весьма эффективной реализацией.
Независимые тесты показывают, что Lua является одним из самых быстрых среди скриптовых языков
Переносимость. Когда мы говорим оперено симо сти, то имеем ввиду запуск Lua на всех платформах, о которых вы только слышали:
все версии Unix и Windows, PlayStation, Xbox, Mac OS X и iOS,
Android, Kindle Fire, NOOK, Haiku, QUALCOMM Brew, мейнфреймы
IBM, RISC OS, Symbian OS, процессоры Rabbit, Raspberry Pi, Arduino и многие другие. Исходный код для каждой из этих платформ практически одинаков не использует условную компиляцию для адаптации своего кода под различные машины вместо этого он придерживается стандартного) С. Таким образом, вам обычно ненужно адаптировать его под новую среду если у вас есть компилятор ANSI Сто вам всего лишь нужно скомпилировать без каких-либо предварительных настроек.
Аудитория
Пользователи Lua обычно относятся код ной из трех широких групп:
те, кто используют Lua, уже встроенный в приложение, те, кто используют Lua автономно, и те, кто используют Lua и С вместе.
Многие используют Lua, встроенный в какую-либо прикладную программу, например, Adobe Lightroom, Nmap или World of Warcraft. Эти приложения используют Lua-C API для регистрации новых функций,
созд ания новых типов и изменения поведения некоторых операций языка, конфигурируя Lua под свою специфическую область. Часто пользователи таких приложений даже не знают, что Lua является независимым языком, адаптированным подданную область. Например,
многие разработчики плагинов для не знают од ругих способах использования этого языка пользователи Nmap, как правило,
рассматривают Lua как язык Nmap Scripting Engine; игроки в World of
Warcraft могут считать Lua языком исключительно для данной игры также полезен как самостоятельный язык, не только для обработки текста и одноразовых маленьких программно также и для различных проектов от среднего до большого размера. Приданном применении основную функциональность дают его библиотеки.
Станд артные библиотеки, например, предлагают базовое сопоставление с образцом и другие функции для работы со строками. Улучшение поддержки своих библиотеку привело к быстрому увеличению количества внешних пакетов. Lua Rocks, система внедрения и управления модулями для, над анный момент насчитывает более пакетов
Наконец, есть программисты, которые работают над ругой стороне скамьи, и которые пишут приложения, использующие Lua как библиотеку С. Такие люди больше пишут на Счем на Lua, хотя им требуется хорошее понимание Lua для создания интерфейсов, которые будут простыми, легкими в использовании и хорошо интегрированными с языком.
Данной книге есть что предложить всем этим людям. Первая часть охватывает сам язык, показывая, как мы можем раскрыть весь его потенциал. Мы фокусируемся на различных конструкциях языка и используем многочисленные примеры и упражнения, чтобы показать,
как их использовать для практических задач. Некоторые главы этой части охватывают базовые понятия, такие как управляющие структуры,
в то время как остальные главы охватывают более продвинутые темы,
такие как итераторы и сопрограммы.
Вторая часть полностью посвящена таблицам, единственной структуре данных в Lua. Главы этой части обсуждают структуры данных, их сохраняемость, пакеты и объектно-ориентированное программирование. Именно там мы раскроем настоящую мощь языка.
Третья часть представляет стандартные библиотеки. Эта часть особенно полезна для тех, кто использует Lua как самостоятельный язык, хотя многие другие приложения также частично или полностью включают в себя стандартные библиотеки. Данная часть отводит по одной главе для каждой стандартной библиотеки математическая библиотека, побитовая библиотека, табличная библиотека, строковая библиотека, библиотека ввод а-вывод а, библиотека операционной системы и отладочная библиотека.
Наконец, последняя часть книги охватывает API между и С для тех, кто использует C, чтобы овладеть полной мощью Lua. Подача материала данной части в силу необходимости весьма отличается от всей остальной книги. Здесь мы будем программировать на Сане на, так что нам придется сменить амплуа. Для некоторых читателей обсуждение может представлять незначительный интерес для других эта часть может оказаться самой важной.
О третьем издании
Эта книга является обновленной и расширенной версией второго издания книги «Programming in Lua» (также известной как PiL 2). Хотя структура книги практически та же самая, это издание включает в себя
изрядное количество нового материала.
Во-первых, я обновил всю книгу до. Особую значимость представляет глава об окружениях, которая была практически полностью переписана. Я также переписал несколько примеров, чтобы показать преимущества от использования новых возможно стей,
пред оставляемых. Тем не менее, я четко обозначил отличия от 5.1, поэтому вы можете использовать книгу и для этой версии языка.
Во-вторых, что более важно, яд обавил упражнения вовсе главы книги. Эти упражнения варьируются от простых вопросов о языке до небольших полноценных проектов. Некоторые примеры иллюстрируют важные аспекты программирования на Lua итак же важны, как примеры,
которые расширяют ваш набор полезных приемов.
Как ив случае с первыми вторым изданиями мы опубликовали это третье издание самостоятельно. Несмотря на ограниченные возможности распространения, этот подход обладает рядом преимуществ мы сохраняем полный контроль над содержимым книги мы сохраняем все права на предложение книги в других формах;
мы свободны выбирать, когда выпустить следующее издание мы можем быть уверены, что выпуск данной книги не будет прекращен.
Другие ресурсы
Справочник (reference manual) по языку необходим всем, кто действительно хочет его освоить. Эта книга не заменяет справочник Напротив, они дополняют друг друга. Справочник лишь описывает Он не показывает ни примеров, ни объяснений для конструкций языка. С
д ругой стороны, он полностью описывает язык эта книга опускает некоторые редко используемые темные углы Lua. Более того,
справочник является официальным документом о Lua. Там, где эта книга расходится со справочником, доверяйте справочнику. Чтобы получить справочники дополнительную информацию о Lua, посетите веб-сайт
Вы также можете найти полезную информацию на сайте, список сторонних пакетов и документации, и архив официальной рассылки по Эта книга описывает Lua 5.2, хотя большая часть ее содержимого также применима к Lua 5.1 и Lua 5.0. Некоторые отличия Lua 5.2 от
предыдущих версий Lua 5 четко обозначены в тексте книги. Если вы используете более новую версию (выпущенную после этой книги),
обратитесь к соответственному руководству по поводу отличий между версиями. Если вы используете версию старше 5.2, то пришла пора подумать об обновлении.
Некоторые типографские соглашения
В данной книге "строковые литералы " заключены в двойные кавычки, а одиночные символы, например 'а ', заключены вод инарные кавычки.
Строки, которые применяются как образцы, также заключены вод инарные кавычки, например '
[%w_]*
'. Книга использует моноширинный шрифт как для кусков кода, таки для идентификаторов. Для
зарезервированных слов используется полужирный шрифт. Крупные куски кода показаны с применением следующего стиля- программа "Hello World"
print ("Hello World") --> Hello Обозначение
-->
показывает результат выполнения оператора или,
изред ка, результат выражения) --> 10 13+3 --> Поскольку двойной дефис) начинает комментарий в Lua, вы можете без проблем применять данные обозначения в ваших программах.
Наконец, в книге используется обозначение для указания на то, что что-то эквивалентно чему-то другому Примечание так выглядят примечания от автора книги) (Атак выглядят примечания от перевод чика.)
Запуск примеров
Вам понадобится интерпретатор Lua для запуска примеров из этой книги. Вид еале вам следует использовать Lua 5.2, но большинство примеров без каких-либо изменений будет работать и на Lua Сайт Lua (
) хранит исходный код этого интерпретатора. Если у вас есть компилятор Си знание того, как
скомпилировать код Сна вашем компьютере, то вам стоит попробовать установить Lua из его исходного кода это действительно легко. Сайт
Binaries поищите luabinaries
) предлагает заранее скомпилированные интерпретаторы для большинства основных платформ. Если вы используете Linux или другую подобную систему, вы можете проверить репозиторий вашего дистрибутива некоторые дистрибутивы уже предлагают готовые пакеты с Lua. Для хорошим выбором является Lua for Windows (поищите luaforwindows
), являющийся заряженной средой для. Он включает в себя интерпретатор, интегрированный текстовый редактор и множество библиотек.
Если вы используете Lua, встроенный в приложение, такое как или Nmap, то вам может понадобиться руководство поданному приложению (или помощь местного гуру, чтобы разобраться, как запускать ваши программы. Тем не менее, Lua остается все тем же языком большинство вещей, которое мы увидим в этой книге,
применимо независимо то того, как вы используете Lua. Однако, я рекомендую начать изучение Lua с автономного интерпретатора для запуска ваших первых примеров и экспериментов.
Благодарности
Прошло уже почти десять лет с тех пор, как я опубликовал первое издание этой книги. Ряд друзей и организаций помогал мне на этом пути.
Как всегда, Луиг Хенрик де Фигуред о и Вальд емар Селес, соавторы, предложили все виды помощи. Андре Карригал, Аско Кауппи, Бретт
Капилик, Диего Мехаб, Эд вин Морагас, Фернанд о Джефферсон, Гэвин
Врес, Джон Д. Рамсд елл и Норман Ремси предоставили неоценимые замечания и полезную аналитическую информацию для различных изданий этой книги.
Луиза Новаэс, глава отдела искусства и дизайна в PUC-Rio, смогла найти время в своем занятом графике, чтобы создать идеальную обложку для данного издания. предложило надежный и эффективный вариант для печати и распространения данной книги. Без них о самостоятельной публикации этой книги не могло бы быть и речи.
Центр латиноамериканских исследований в Стенд форд ском университете предоставил мне крайне необходимый перерыв от регулярной работы в очень стимулирующем окружении, вовремя которого я и сделал большую часть работы над третьим изд анием.
Я также хотел бы поблагодарить Папский католический университет
Рио де Жанейро
(PUC-Rio) и Бразильский национальный исследовательский совет (CNPq) за их постоянную поддержку моей работы.
Наконец, яд олжен выразить мою глубокую благодарность Ноэми
Род ригес за все виды помощи (в том числе и технической) и скрашивание моей жизни
Часть Язык
ГЛАВА Начало работы
Прод олжая сложившуюся традицию, наша первая программа навсего лишь печатает "
Hello World
":
print("Hello Если вы используете автономный интерпретатор Lua, то все, что вам требуется для запуска вашей первой программы — это вызвать интерпретатор (обычно он называется lua или lua5.2
) с именем текстового файла, содержащего вашу программу. Если вы сохраните вышеприведенную программу в файл hello.lua
, то следующая команда должна его запустить lua В качестве более сложного примера следующая программа определяет функцию для вычисления факториала заданного числа,
запрашивает у пользователя число и печатает его факториал- определяет функцию факториала function fact (n)
if n == 0 then return 1
else return n * fact(n-1)
end end print("enter a number:")
a = io.read("*n") -- считывает число print(fact(a))
1.1. Куски
Кажд ый выполняемый Lua фрагмент кода, такой как файл или отдельная строка в интерактивном режиме, называется куском.
Кусок (chunk) — это просто последовательность команд (или операторов ненужен разделитель между идущими подряд операторами, новы можете использовать точку с запятой, если хотите. Мое личное правило — использовать точки с запятой только для разделения двух или более операторов, записанных водной строке. Переводы строк не играют никакой роли в синтаксисе Lua; например, следующие четыре куска допустимы и эквивалентны = 1
b = a*2
a = 1;
b = a*2;
a = 1; b = a*2
a = 1 b = a*2 -- уродливо, но допустимо
Кусок может быть просто одиночным оператором, как в примере World», или состоять из набора операторов и определений функций (которые на самом деле являются присваиваниями, как мы увидим позже, как в примере с факториалом. Кусок может быть настолько большим, насколько вы захотите. Поскольку также используется как язык для описания данных, куски в несколько мегабайт не являются редкостью. У интерпретатора Lua не возникает никаких проблем при работе с большими кусками.
Вместо записи вашей программы в файл вы можете запустить автономный интерпретатор в интерактивном режиме. Если вы запустите lua без аргументов, то увидите его приглашение ввода (С) 1994-2012 Lua.org, С этого момента каждая команда, которую вы наберете (как,
например, print "Hello World
"), выполняется сразу после ее ввода. Для выхода из интерактивного режима и интерпретатора просто наберите управляющий символ конца файла (в UNIX, вили вызовите функцию exit из библиотеки операционной системы — для этого нужно набрать В интерактивном режиме Lua обычно интерпретирует каждую строку, которую вы набираете, как законченный кусок. Однако, если он обнаруживает, что строка не образует законченный кусок, то он ждет продолжения ввода до тех пор, пока этот кусок не будет закончен.
Таким образом, вы можете вводить много строчные определения наподобие функции factorial прямо в интерактивном режиме. Тем не менее, обычно более удобно помещать подобные определения в файл и затем вызывать Lua для его выполнения.
Вы можете использовать опцию
-i
, чтобы дать указание Lua начать интерактивный сеанс после выполнения заданного куска lua -i Строка с командой вроде этой выполнит кусок в файле prog и затем выведет приглашение ввода интерактивного режима. Это особенно удобно для отладки и тестирования вручную. В конце данной главы мы рассмотрим другие опции автономного интерпретатора.
Другой способ выполнять куски состоит в применении функции dofile
, которая немедленно выполняет файл. Например, допустим, у вас есть файл lib1.lua со следующим кодом Тогда в интерактивном режиме вы можете набрать dofile("lib1.lua") -- загружает вашу библиотеку n = norm(3.4, 1.0)
> print(twice(n)) --> Функция dofile также удобна, когда вы тестируете фрагмент код а.
Вы можете работать с двумя окнами одно будет текстовым редактором с вашей программой (скажем, в файле prog.lua
), ад ругое консолью,
выполняющей Lua в интерактивном режиме. После сохранения изменений в вашей программе, вы выполняете dofile("prog.lua")
в консоли Lua для загрузки нового кода затем вы проверяете этот новый код , вызывая его функции и печатая результаты. Некоторые лексические соглашения
Ид ентификаторы или имена) в
Lua могут быть любой последовательностью из букв, цифр и символов подчеркивания, не начинающейся с цифры, например
i j i10 _ij aSomewhatLongName Вы должны избегать идентификаторов, начинающихся с символа подчеркивания, за которым следует одна или несколько заглавных букв
(как, например,
_VERSION
); они зарезервированы в Lua для особых целей.
Обычно я использую идентификатор одиночный символ подчеркивания) для пустых переменных.
В старых версиях Lua понятие того, что является буквой, зависело от локали. Однако, подобные буквы делают вашу программу непригодной для выполнения на системах, которые не поддерживают данную локаль.
Поэтому Lua 5.2 разрешает использовать вид ентификаторах только буквы изд иапазонов и Следующие слова зарезервированы мы не можем использовать их в качестве идентификаторов учитывает регистр букв and — это зарезервированное слово, но
And и
AND
— это два отличных от него и друг отд руга ид ентификатора.
Комментарий начинается в любом месте с двойного дефиса) и длится до конца строки кода также поддерживает блочный комментарий, который начинается си длится до ближайших Примечание Блочные комментарии могут быть более сложными, как мы увидим в разделе. Распространенным приемом для закомментирования фрагмента кода является заключение этого кода между и
--]]
, как показано ниже) -- ничего не происходит (закомментировано)
--]]
Для восстановления работоспособности этого кода мы добавляем один дефис к первой строке) --> В первом примере впервой строке начинает блочный комментарий
ад войной дефис в последней строке по-прежнему находится внутри этого комментария. Во втором примере последовательность начинает обычный одно строчный комментарий, поэтому первая и последняя строки становятся независимыми комментариями. В этом случае print находится вне комментариев. Глобальные переменные
Глобальным переменным ненужны объявления вы их просто используете. Обратиться к неинициализированной переменной не является ошибкой вы всего лишь получите значение nil в качестве результата) --> nil b = 10
print(b) --> Если вы присвоите nil глобальной переменной, то Lua поведет себя так, как если бы эта переменная никогда не использовалась = nil print(b) --> Послед анного присваивания Lua может со временем высвободить память, выделенную под эту переменную. Автономный интерпретатор
Автономный интерпретатор (также называемый св связи с названием его исходного файла или просто из-за имени его выполнимого файла) — это небольшая программа, которая позволяет использовать Lua непосредственно. В данном разделе представлены ее основные опции.
Когд а интерпретатор загружает файл, то он пропускает первую строку кода, если она начинается с октоторпа ('
#
'). Это свойство позволяет использовать Lua как скриптовый интерпретатор в системах. Если вы начнете ваш скрипт с чего-нибуд ь вроде при условии, что автономный интерпретатор находится вили то вы можете вызвать ваш скрипт напрямую, без явного вызова интерпретатора Использование lua следующее Все параметры необязательны. Как мы уже видели, когда мы запускаем lua без аргументов, интерпретатор переходит в интерактивный режим.
Опция
-e позволяет нам вводить код прямо в командной строке, как показано ниже lua -е "print (math.sin(12))" --> -0.53657291800043
(UNIX требует двойных кавычек, чтобы командная оболочка не стала интерпретировать круглые скобки).
Опция
-l загружает библиотеку. Как мы уже видели ранее,
-i вызывает интерактивный режим после выполнения остальных аргументов. Таким образом, следующий вызов загрузит библиотеку затем выполнит присваивание хи выведет приглашение ввода для взаимодействия -е "х = В интерактивном режиме вы можете напечатать значение любого выражения, набрав строку, начинающуюся со знака равенства, за которым следует выражение = math.sin(3) --> 0.14112000805987
> а = 30
> = а --> Это особенность позволяет использовать Lua как калькулятор.
Перед выполнением своих аргументов интерпретатор ищет переменную окружения с именем
LUA_INIT_5_2
или, если такой переменной нет,
LUA_INIT
. Если одна из этих переменных присутствует и содержит
@
имя_файла, то интерпретатор выполнит заданный файл. Если
LUA_INIT_5_2
(или
LUA_INIT
) определена, но ее содержимое не начинается сто интерпретатор считает, что она содержит код Lua и выполняет его. предоставляет огромные возможности по конфигурированию автономного интерпретатора, поскольку при конфигурировании нам доступна вся функциональность. Мы можем предварительно загружать пакеты, изменять текущий путь, определять наши собственные функции, переименовывать или уничтожать функции и т. д Скрипт может получать свои аргументы из предопределенной глобальной переменной arg
. При таком вызове, как
%lua script a b интерпретатор перед выполнением скрипта создаст таблицу arg со всеми аргументами командной строки. Имя скрипта располагается по индексу, первый аргумент (в примере это а) располагается по индексу и т. д Предшествующие опции располагаются по отрицательным инд ексам,
по скольку они находятся перед скриптом. Например, рассмотрим этот вызов lua -e "sin=math.sin" script a Интерпретатор собирает аргументы следующим образом = "lua"
arg[-2] = "-e"
arg[-1] = "sin=math.sin"
arg[0] = "script"
arg[1] = "a"
arg[2] = "Чаще всего скрипт использует только положительные индексы (в примере это и Начиная с Lua 5.1 скрипт также может получить свои аргументы посредством выражения с переменным числом аргументов. В главном теле скрипта выражение
(три точки) передает в скрипт эти аргументы (мы обсудим выражения с переменным числом аргументов в разделе 5.2).
Упражнения
Упражнение 1.1. Запустите пример с факториалом. Что случится с вашей программой, если вы введете отрицательное число Измените пример, чтобы избежать этой проблемы.
Упражнение 1.2. Запустите пример twice
, один раз загружая файл при помощи опции
-l
, ад ругой раз через dofile
. Что для вас предпочтительнее 1.3. Можете ли вы назвать другой язык, использующий для комментариев?
Упражнение 1.4. Какие из следующих строк являются допустимыми идентификаторами Упражнение 1.5. Напишите простой скрипт, который печатает свое имя, не зная его заранее
ГЛАВА Типы и значения — язык с динамической типизацией. В нем нет определений типов каждое значение содержит в себе свой собственный тип.
В Lua существует восемь базовых типов nil, boolean, number, string,
table, function, userdata и thread. Функция type возвращает имя типа любого заданного значения world")) --> string print(type(10.4*3)) --> number print(type(print)) --> function print(type(type)) --> function print(type(true)) --> boolean print(type(nil)) --> nil print(type(type(X))) --> Последняя строка вернет string вне зависимости от значения поскольку результат type всегда является строкой.
У переменных нет предопределенных типов любая переменная может содержать значения любого типа) --> nil ('a' не инициализирована = 10
print(type(a)) --> number a = "a string!!"
print(type(a)) --> string a = print -- да, это допустимо) --> Обратите внимание на последние две строки в Lua функции являются значениями первого класса ими можно манипулировать, как и любыми другими значениями. (Более подробно мы рассмотрим данные средства в главе Обычно, когда вы используете одну и туже переменную для значений разных типов, это приводит к запутанному коду. Од нако,
иногд а разумное использование этой возможности оказывается полезным, например, при использовании nil, чтобы отличать нормальное возвращаемое значение от непредусмотренного состояния. Отсутствие значения (
nil
)
Тип nil — это тип сед инственным значением, nil, основная задача которого состоит в том, чтобы отличаться от всех остальных значений использует nil как нечто, не являющееся значением, чтобы изобразить отсутствие подходящего значения. Как мы уже вид ели,
глобальные переменные по умолчанию имеют значение nil до своего первого присваивания, ивы можете присвоить nil глобальной переменной, чтобы удалить ее. Логические значения (Тип boolean обладает двумя значениями — true и false, которые представляют традиционные логические (или булевы) значения. Од нако,
не только булевы значения могут выражать условие в Lua условие может быть представлено любым значением. Проверки условий
(например, условий в управляющих структурах) считают nil и булево false ложными, а все прочие значения истинными. В частности, при проверках условий Lua считает ноль и пустую строку истинными значениями.
На протяжении данной книги ложными будут называться значения nil и false, а истинными — все остальные. Когда речь идет именно о булевых значениях, они указываются явно как false или true.
2.3. Числа (Тип number представляет вещественные числа, те. числа двойной точности с плавающей точкой (тип double в C). В Lua нет целочисленного типа (тип integer в Некоторые опасаются, что даже простые операции инкремента или сравнения могут некорректно работать с числами с плавающей точкой.
Од нако, на самом деле это не так. Практически все платформы в наше время поддерживают стандарт для представления чисел с плавающей точкой. Согласно этому стандарту, единственным возможным источником ошибок является ошибка пред ставления,
которая происходит, когда число не может быть точно пред ставлено.
Операция округляет свой результат, только если у него нет точного представления. Любая операция, результат которой может быть точно представлен, должна выдавать его без округления самом деле любое целое число вплоть до (приблизительно
10 16
) имеет точное представление в виде числа двойной точности с плавающей точкой. Когда вы используете вещественные числа для представления целых, никаких ошибок округления не происходит, пока модуль числа не превышает 2 53
. В частности, число Lua может представлять любые битовые целые числа без проблем с округлением.
Разумеется, у дробных чисел могут быть ошибки представления. Эта ситуация не отличается от той, когда вы пользуетесь ручкой и бумагой.
Если мы хотим записать
1/7
в десятичном виде, то мы должны будем гд е-то остановиться. Если мы используем десять цифр для представления числа, то
1/7
будет округлено до. Если мы вычислим
1/7*7
при помощи десяти цифр, то получим
0.999999994
, что отличается от
1
. Более того, дробные числа, которые имеют конечное представление в десятичном виде, могут иметь бесконечное представление в двоичном виде. Например,
12.7-20+7.3
неравно нулю,
по скольку у обоих чисел,
12.7
и
7.3
, нет точного конечного представления в двоичном виде (см. упражнение Прежде чем мы продолжим, запомните у целых чисел есть точное представление и потому нет ошибок округления.
Большинство современных процессоров выполняет операции с плавающей точкой также быстро, как и с целыми числами (или даже быстрее. Тем не менее, легко скомпилировать Lua так, чтобы он использовал для числовых значений другой тип, например, длинные целые числа (тип long вили числа одинарной точности с плавающей точкой (тип float в C). Это особенно удобно для платформ без аппаратной поддержки чисел с плавающей точкой, например, для встраиваемых систем. Подробности смотрите в файле luaconf.h изд истрибутива.
Мы можем записывать числовые константы вместе с необязательной десятичной дробной частью и необязательным десятичным поряд ком.
Примеры допустимых числовых константе е 5Е+20
Более того, мы также можем использовать шестнадцатеричные константы, применив префикс
0x
. Начиная с Lua 5.2, шестнадцатеричные константы также могут иметь дробную часть и двоичный порядок (с префиксом 'р ' или 'Р, как вслед ующих примерах (255) 0х1АЗ (419) 0x0.2 (0.125) 0х1р-1 (0.5)
0ха.Ьр2 (Для каждой константы мы добавили в круглых скобках ее десятичное представление. Строки (Тип string в Lua имеет обычный смысл последовательность символов. Lua поддерживает все битовые символы, и его строки могут содержать символы с любыми числовыми кодами, включая нульсимволы. Это значит, что вы можете хранить в виде строк любые бинарные данные. Вы также можете хранить строки Юникод а в любом представлении и т. д .). Стандартная библиотека, которая идет вместе сне предлагает явную поддержку этих пред ставлений.
Тем не менее, вы можете работать со строками UTF-8 вполне привычным образом, что будет рассмотрено в разделе Строки в Lua являются неизменяемыми значениями. Вы не можете изменить символ внутри строки, как выделаете это в С вместо этого вы создаете новую строку с необходимыми изменениями, как показано вслед ующем примере = "one string"
b = string.gsub(a, "one", "another") -- меняет части строки print(a) --> строка "one"
print(b) --> строка "Строки в Lua подвержены автоматическому управлению памятью,
как и любые другие объекты Lua (таблицы, функции и т. д .). Это значит,
что вам ненужно беспокоиться о выделении и освобождении строк;
этим за вас займется Lua. Строка может состоять из одного символа или целой книги. Программы, которые обрабатывают строки из Кили М символов, — нередко сть в Вы можете получить длину строки, используя префиксную операцию '
#
' (называемую операцией длины = "hello"
print(#a) --> 5
print(#"good\0bye") --> 8
Cтроковые литералы
Мы можем определять границы строковых литералов при помощи
пар одинарных или двойных кавычек = "a line"
b = 'another Эти виды записи эквиваленты единственное отличие состоит в том,
что внутри одного вида кавычек вы можете использовать другой, не применяя экраны те. экранированные/управляющие последовательно сти).
Это дело вкуса, но большинство программистов всегда использует кавычки одного вида для одних и тех же видов строк, где виды строк зависят от программы. Например, библиотека, которая работает сможет зарезервировать строки вод инарных кавычках для фрагментов, поскольку эти фрагменты часто содержат двойные кавычки.
Строки в
Lua могут содержать следующие образные экранированные последовательно сти:
\а звонок возврат на одну позицию (backspace)
\f перевод страницы перевод строки
\г возврат каретки горизонтальная табуляция вертикальная табуляция
\\
обратный слеш
\"
д войная кавычка
\'
од инарная кавычка
След ующие примеры иллюстрируют их использование 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: 'Мы также можем задать символ в строке при помощи его числового значения через экранированные последовательности и
\x\
hh, где — это последовательность не более чем из трех десятичных цифр, a
hh — последовательность ровно изд вух шестнадцатеричных цифр. В
качестве примера посложнее возьмем два литерала "
alo\n123\
" и '
\971o\10\04923
'. Они обладают одними тем же значением в системе,
использующей ASCII: 97 — это код ASCII для 'а ', 10 — это код для символа перевода строки, а 49 — это код для цифры '
1
'. (В этом примере мы должны записать значение 49 при помощи трех десятичных цифр как, поскольку за ним следует другая цифра иначе Lua прочтет это число как 492). Мы также можем записать эту строку как '
\x61\x6c\x6f\x0a\x31\x32\x33\x22
', представляя каждый символ его шестнадцатеричным код ом.
Дпинные строки
Мы можем задавать строковые литералы при помощи пар изд войных квадратных скобок, как мы делали это с длинными комментариями.
Литералы в этой скобочной форме могут занимать несколько строка экранированные последовательности в этих строках не будут интерпретироваться. Более того, эта форма игнорирует первый символ строки, если это перевод строки. Эта форма особенно удобна для написания строк, содержащих большие фрагменты кода, как вслед ующем примере = [[
  1   2   3   4   5   6   7   8   9   ...   28

перейти в каталог файлов


связь с админом