Викиучебник ruwikibooks https://ru.wikibooks.org/wiki/%D0%97%D0%B0%D0%B3%D0%BB%D0%B0%D0%B2%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0 MediaWiki 1.47.0-wmf.24 first-letter Медиа Служебная Обсуждение Участник Обсуждение участника Викиучебник Обсуждение Викиучебника Файл Обсуждение файла MediaWiki Обсуждение MediaWiki Шаблон Обсуждение шаблона Справка Обсуждение справки Категория Обсуждение категории Полка Обсуждение полки Импортировано Обсуждение импортированного Рецепт Обсуждение рецепта Задача Обсуждение задачи TimedText TimedText talk Модуль Обсуждение модуля Event Event talk Фоторецептурный справочник/Kodak D-90 0 21732 270393 154179 2026-10-20T22:05:44Z Def2010 48479 оформление 270393 wikitext text/x-wiki '''Kodak D-90''' — пирогаллоловый проявитель, предназначен для кюветного проявления листовых фотоплёнок. Проявитель использовался фирмой [[w:Eastman Kodak|Eastman Kodak]] с начала XX века и ведёт своё происхождение от рецепта, приведённого в ежегодном альманахе British Journal of Photography. Даёт удовлетворительные результаты, но как и все пирогаллоловые проявители быстро окисляется и приходит в негодность{{sfn|Crabtree|1938|с=304}}. == Состав == Готовятся два запасных раствора{{sfn|Crabtree|1938|с=304}}: === Раствор 1 === * [[w:Сульфит натрия|Сульфит натрия]] б/в — 70,0 г; * [[w:Метабисульфит натрия|Метабисульфит натрия]] б/в— 17,0 г; * [[w:Пирогаллол|Пирогаллол]] — 20,0 г; * Вода — до 1 л. === Раствор 2 === * [[w:Карбонат натрия|Карбонат натрия]] б/в — 75,0 г; * [[w:Бромид калия|Бромид калия]] — 1,0 г; * Вода — до 1 л. Для нормального контраста нужно взять одну часть раствора 1, одну часть раствора 2 и две части воды. Для уменьшенного контраста берется одна часть раствора 1, одна часть раствора 2 и четыре части воды, для увеличенного — одна часть раствора 1, одна часть раствора 2 и одна часть воды{{sfn|Crabtree|1938|с=304}}. == Обработка == Из-за быстрого окисления проявитель необходимо готовить сразу перед использованием. Проявлять в течение 4—6 минут при 18 °C{{sfn|Crabtree|1938|с=304}}. == Примечания == {{Примечания}} == Литература == * {{книга | автор = Crabtree J. I., Matthews G. E. | заглавие = Photographic chemicals and solutions | издательство = American photographic publishing Co. | место=Boston, Massachusetts | год = 1938 | ref = Crabtree}} [[Категория:Проявители|Kodak D-090]] ht7p93oa1svoz5r1ggvq3llm38uo3zs Lua/Типы данных 0 28481 270396 252546 2026-10-21T07:38:04Z Maaqqw 77294 /* string */ 270396 wikitext text/x-wiki {{Навигация учебника|Содержание = Да}} == Еще раз о Lua == Мы говорили, что Lua сильно похож на [[Python]]. Еще одна общая особенность для двух данных языков- динамическая типизация. Динамическая типизация в данных языках позволяет изменить типы переменных: из числа можно сделать строку, а из строки число; а сами типы переменных определяются интерпретатором (в строго типизированных языках, тип переменной надо указывать заранее: в C++ целочисленную переменную можно создать таким образом - int a = 5). Сейчас мы разберемся подробнее, какую роль играет типизация и как работать с переменными. == Переменная какого типа? == Чтобы определить к какому типу относится переменная, можно использовать функцию type(). О функциях мы узнаем позже, но думаю, вы уже видите некоторые параллели функций type() и print(). И так, пример:<syntaxhighlight lang="lua"> type(15) --> number type(str) --> nil type ("str") --> string </syntaxhighlight>Как мы видим, функция type() говорит нам, что наши значения - число, nil, строка соответственно. Интересное замечание: сама функция type() возвращает строку == Типы данных в Lua == В Lua есть 8 базовых (то есть встроенных в сам язык) типов: number(число), string(строка), boolean(логический тип), nil (тип "ничего"), table,function, userdata, thread. Пришло время разобраться в каждом из них. === number(число) === Что разительно отличает Lua от других языков - существование только одного типа данных для чисел и это - number. Любые числа будут number:<syntaxhighlight lang="lua"> -- Пример 1 a = 5 type(a) --> number -- Пример 2 a = 5.111 --> 5,111 индентично type(a) --> number -- Пример 3 a = 5E+6 --> 5e+6 индентично type(a) --> number print(a) --> 5 000 000 </syntaxhighlight>Если мы рассмотрим первый пример, то в других языках это бы называлось integer, то есть, целым числом. Второй пример: float или double (то есть число с плавающей точкой) в других языках. Заметим, что различие между точкой и запятой в Lua не делается - это все числа. Числа можно записывать не в десятичной системе счисления, но и в шестнадцатеричной:<syntaxhighlight lang="lua"> type(0xFFFF) --> number print(0xFFFF) --> 65535 </syntaxhighlight> === nil === Как мы уже писали ранее, тип nil является ничем. Он создан для того, что показывать, что в переменной нет ничего (а как мы видели ранее, "нет переменной").<syntaxhighlight lang="lua" line="1"> print(a) --> nil, так как переменной а - не существует a = 5 print(a) --> 5 a = nil --> эксперимент: зададим другое значение a print(a) --> nil </syntaxhighlight>Посмотрите на строку 4: здесь проявилось свойство динамической типизации - мы смогли превратить "a" у которой был тип number в "а", у которой тип nil. В таких языках как Lua, Python, Ruby, переопределить переменную достаточно просто. В отличии от C++ или Java. А теперь посмотрите на последнюю, 5-ую строку: переопределив "а" в nil, мы, фактически, уничтожили переменную "a". === string === Тип string представляет из себя последовательность символов (в других языках программирования символы имеют свой тип - char). Под символами (опять же, в других языках программирования) подразумевается одна буква, например, 'l', 'u' или 'a'. Вместе они образуют слово "lua", которое имеет тип string. Но вернемся к Lua: в этом языке нет типа char, а значит любое слово (обрамленное одинарными или двойными кавычками) будет является string. Мы разобрались с тем, что одинарные и двойные кавычки работают только в одной строке. Но как нам разместить многострочный текст? Для этого используются <nowiki>[[ ... ]]</nowiki><syntaxhighlight lang="lua"> a = "Wiki books" --> здесь произойдет ошибка a = [[ Wikipedia and Wikibooks ]] --> отобразится корректно </syntaxhighlight> Заметим, что string является неизменяемым типом: вы не можете заменить определенный символ в строке на другой. Тем не менее, вы можете работать над строкой используя функции:<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 a = "Wikibooks" print(#a) --> 9 </syntaxhighlight> ==== Экранированные последовательности ==== {| class="wikitable" |+ !Символ !Описание |- |\n |Перевод на новую строку |- | | |- | | |} === boolean === Тип boolean может принимать два значения - true (истина) или false (ложь). Конечно же, мы можем задать их в переменной, но чаще это не имеет смысла, так как наиболее частые случаи использования boolean - условные конструкции, где проще использовать операторы сравнения (которые и будут возвращать boolean). Истина возращается тогда, когда выражение является истинным (2+2 == 4 или 2+2 ~= 4), ложь является противоположным значением. === table === Тип table переставляет из себя ассоциативный массив (или словарь, если сравнивать с Python). Под массивом, мы могли бы понимать некий набор переменных. А если же говорить о ассоциативном массиве, то у переменных есть "ассоциация", то есть название, или правильнее - ключ. Есть еще последовательность: массив, ключи которого представляют из себя последовательные натуральные числа (от 1 до n, где n - последний ключ массива). В этом случае правильно было бы сказать, что в последовательности ключи являются индексами. Чтобы создать тип 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>Хочу заметить, что такой способ можно использовать только когда вы представили ключ в виде строки. Символ # представляет из себя длину строки. Но в случае с таблицей - это ее длина (а вернее, количество элементов в ней). Соответственно, мы можем совершать следующие операции:<syntaxhighlight lang="lua"> -- Пусть есть некий массив а a = {} print(a[#a]) --> напечает последний элемент (#a - значение последнего индекса для массива) a[#a+1] = 15 --> добавляет еще один элемент в конец массива </syntaxhighlight> Существуют и другие способы создания таблицы. Первый из них - создание последовательности(или его еще называют - список): <syntaxhighlight lang="lua"> a = {"Wikipedia", "Wikibooks", "Wikiversity"} --> Создали в этот раз непустой список print(a[2]) --> Wikibooks </syntaxhighlight>Хочу заметить, что счет индексов в Lua начинается с 1, а не с 0 как в других языках программирования: именно поэтому мы получили Wikibooks,а не Wikiversity как могло произойти в других языках программирования. Можно создать и такой массив с ключ/значением (их в Python называют словарем): <syntaxhighlight lang="lua"> array = {a = 1, b = 2} print(array[b]) --> nil </syntaxhighlight>Последнее, что мы рассмотрим для таблицы в этой главе - это многомерные массивы. Многомерные массивы - массивы, в которых могут быть вложены другие массивы: <syntaxhighlight lang="lua"> array = {{a,b},{c,d}} --[[ массив из двух массивов (подмассивов) содержащие а и b в одном и c и d в другом--]] print(array[1][1]) --[[a так как мы сначала выберем первый массив {a,b} а из него первый элемент a --]] </syntaxhighlight>Мы разобрали наиболее элементарные типы данных в Lua. Другие типы данных являются специфичными и мы их рассмотрим в следующих главах. == Приведение типов. == Как мы говорили ранее, 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> == Действия с переменными == С переменными (а вернее, только с числовыми переменными) можно проводить арифметические операции:<syntaxhighlight lang="lua"> a = 5 b = 10 -- Сложение print(a + b) --> 15 -- Отрицание print(a - b) --> -5 -- Умножение print(a * b) --> 50 -- Деление print(b/a) --> 2 -- Деление от остатка print(5%2) --> 1 (если вы разделите 5 на 2 вы получите 2 с остатком 1) -- Возведение в степень print(5^2) --> 25 -- Корень от числа print(25^(1/2)) --> 5 </syntaxhighlight>Операции сравнения всегда возвращают значение типа boolean: <syntaxhighlight lang="lua"> a = 5 b = 10 -- Строго больше/меньше print(a>b) --> false (на самом деле b > a) -- Больше/меньше или равно (в отличии от прошлого, равенство вернет true) print(b >= a) --> true print(b >= b) --> true print(b > b) --> false -- Равенство print(b == b) --> true -- Неравенство print(b ~= b) --> false </syntaxhighlight>Что интересно, в отличии от арифметических действий, операции сравнений можно использовать и при работе со строками. Строки сравниваются в алфавитном порядке:<syntaxhighlight lang="lua"> print("a" < "b") --> true </syntaxhighlight>Если же вы хотите использовать более сложные конструкции из арифметических выражений, то вам либо придется использовать скобки, либо запомнить следующую список приоритетов: приоритет операции понижается сверху вниз * ^ * -, not, # * %,*,/ * +,- * .. * Операции сравнения * and * or Думаю, вы заметили, что приоритеты операций совпадают с приоритетом операций в математике. И все же, если у вас есть сомнения в том, какая операция имеет больший приоритет, то рекомендуем использовать скобки - это улучшит читаемость кода. == Логические операции == В Lua существует 3 логические операции: and (и), or(или), not (нет). Результат этих операций - false или true. Фактически, они сравнивают истинность двух выражений. Первое, что мы рассмотрим - and: возвращает true, только когда оба выражения являются истинными:<syntaxhighlight lang="lua"> print(true and true) --> true (и то, и то - истина) print(true and false) --> false (истина только одна, а должны быть истины все) </syntaxhighlight>Второе - or. Он возвращает true, когда хотя бы одно из выражений является истинной:<syntaxhighlight lang="lua"> print(true or false) --> true (одна истина уже есть) print(false or false) --> false (нет истинного выражения) </syntaxhighlight>И третье - not. Возвращает отрицание выражения: если исходное выражение было истиной, то благодаря not оно станет ложным:<syntaxhighlight lang="lua"> print(not true) --> false </syntaxhighlight>А теперь сделаем некоторые замечания: под true/false могут быть любые выражения, которые могут оказаться boolean, например: 2+2 == 4. Второе важное замечание - это приоритеты выражений: если мы захотим сравнить что-то более сложное, например a and b or c, то у нас могут возникнуть проблемы из-за интерпретации этого выражения. And всегда имеет больший приоритет над or: сначала будет сравниваться b или с, а потом итог прошлого выражения и а. Чтобы сделать выражение иным, мы можем использовать такую запись: (a and b) or c. hi7m702mgxv8dttxifi8mo3cmartd2u 270397 270396 2026-10-21T07:43:34Z Maaqqw 77294 /* Экранированные последовательности */ 270397 wikitext text/x-wiki {{Навигация учебника|Содержание = Да}} == Еще раз о Lua == Мы говорили, что Lua сильно похож на [[Python]]. Еще одна общая особенность для двух данных языков- динамическая типизация. Динамическая типизация в данных языках позволяет изменить типы переменных: из числа можно сделать строку, а из строки число; а сами типы переменных определяются интерпретатором (в строго типизированных языках, тип переменной надо указывать заранее: в C++ целочисленную переменную можно создать таким образом - int a = 5). Сейчас мы разберемся подробнее, какую роль играет типизация и как работать с переменными. == Переменная какого типа? == Чтобы определить к какому типу относится переменная, можно использовать функцию type(). О функциях мы узнаем позже, но думаю, вы уже видите некоторые параллели функций type() и print(). И так, пример:<syntaxhighlight lang="lua"> type(15) --> number type(str) --> nil type ("str") --> string </syntaxhighlight>Как мы видим, функция type() говорит нам, что наши значения - число, nil, строка соответственно. Интересное замечание: сама функция type() возвращает строку == Типы данных в Lua == В Lua есть 8 базовых (то есть встроенных в сам язык) типов: number(число), string(строка), boolean(логический тип), nil (тип "ничего"), table,function, userdata, thread. Пришло время разобраться в каждом из них. === number(число) === Что разительно отличает Lua от других языков - существование только одного типа данных для чисел и это - number. Любые числа будут number:<syntaxhighlight lang="lua"> -- Пример 1 a = 5 type(a) --> number -- Пример 2 a = 5.111 --> 5,111 индентично type(a) --> number -- Пример 3 a = 5E+6 --> 5e+6 индентично type(a) --> number print(a) --> 5 000 000 </syntaxhighlight>Если мы рассмотрим первый пример, то в других языках это бы называлось integer, то есть, целым числом. Второй пример: float или double (то есть число с плавающей точкой) в других языках. Заметим, что различие между точкой и запятой в Lua не делается - это все числа. Числа можно записывать не в десятичной системе счисления, но и в шестнадцатеричной:<syntaxhighlight lang="lua"> type(0xFFFF) --> number print(0xFFFF) --> 65535 </syntaxhighlight> === nil === Как мы уже писали ранее, тип nil является ничем. Он создан для того, что показывать, что в переменной нет ничего (а как мы видели ранее, "нет переменной").<syntaxhighlight lang="lua" line="1"> print(a) --> nil, так как переменной а - не существует a = 5 print(a) --> 5 a = nil --> эксперимент: зададим другое значение a print(a) --> nil </syntaxhighlight>Посмотрите на строку 4: здесь проявилось свойство динамической типизации - мы смогли превратить "a" у которой был тип number в "а", у которой тип nil. В таких языках как Lua, Python, Ruby, переопределить переменную достаточно просто. В отличии от C++ или Java. А теперь посмотрите на последнюю, 5-ую строку: переопределив "а" в nil, мы, фактически, уничтожили переменную "a". === string === Тип string представляет из себя последовательность символов (в других языках программирования символы имеют свой тип - char). Под символами (опять же, в других языках программирования) подразумевается одна буква, например, 'l', 'u' или 'a'. Вместе они образуют слово "lua", которое имеет тип string. Но вернемся к Lua: в этом языке нет типа char, а значит любое слово (обрамленное одинарными или двойными кавычками) будет является string. Мы разобрались с тем, что одинарные и двойные кавычки работают только в одной строке. Но как нам разместить многострочный текст? Для этого используются <nowiki>[[ ... ]]</nowiki><syntaxhighlight lang="lua"> a = "Wiki books" --> здесь произойдет ошибка a = [[ Wikipedia and Wikibooks ]] --> отобразится корректно </syntaxhighlight> Заметим, что string является неизменяемым типом: вы не можете заменить определенный символ в строке на другой. Тем не менее, вы можете работать над строкой используя функции:<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 a = "Wikibooks" print(#a) --> 9 </syntaxhighlight> ==== Экранированные последовательности ==== {| class="wikitable" |+ !Символ !Описание |- |\n |Перевод на новую строку |- |\\ |Обратный слеш (\) |- |\" |Двойная кавычка |- |\' |Одинарная кавычка |- |\[ | |- |\] |Закрывающая квадратная скобка |- |\_ |Нижнее подчёркивание |} === boolean === Тип boolean может принимать два значения - true (истина) или false (ложь). Конечно же, мы можем задать их в переменной, но чаще это не имеет смысла, так как наиболее частые случаи использования boolean - условные конструкции, где проще использовать операторы сравнения (которые и будут возвращать boolean). Истина возращается тогда, когда выражение является истинным (2+2 == 4 или 2+2 ~= 4), ложь является противоположным значением. === table === Тип table переставляет из себя ассоциативный массив (или словарь, если сравнивать с Python). Под массивом, мы могли бы понимать некий набор переменных. А если же говорить о ассоциативном массиве, то у переменных есть "ассоциация", то есть название, или правильнее - ключ. Есть еще последовательность: массив, ключи которого представляют из себя последовательные натуральные числа (от 1 до n, где n - последний ключ массива). В этом случае правильно было бы сказать, что в последовательности ключи являются индексами. Чтобы создать тип 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>Хочу заметить, что такой способ можно использовать только когда вы представили ключ в виде строки. Символ # представляет из себя длину строки. Но в случае с таблицей - это ее длина (а вернее, количество элементов в ней). Соответственно, мы можем совершать следующие операции:<syntaxhighlight lang="lua"> -- Пусть есть некий массив а a = {} print(a[#a]) --> напечает последний элемент (#a - значение последнего индекса для массива) a[#a+1] = 15 --> добавляет еще один элемент в конец массива </syntaxhighlight> Существуют и другие способы создания таблицы. Первый из них - создание последовательности(или его еще называют - список): <syntaxhighlight lang="lua"> a = {"Wikipedia", "Wikibooks", "Wikiversity"} --> Создали в этот раз непустой список print(a[2]) --> Wikibooks </syntaxhighlight>Хочу заметить, что счет индексов в Lua начинается с 1, а не с 0 как в других языках программирования: именно поэтому мы получили Wikibooks,а не Wikiversity как могло произойти в других языках программирования. Можно создать и такой массив с ключ/значением (их в Python называют словарем): <syntaxhighlight lang="lua"> array = {a = 1, b = 2} print(array[b]) --> nil </syntaxhighlight>Последнее, что мы рассмотрим для таблицы в этой главе - это многомерные массивы. Многомерные массивы - массивы, в которых могут быть вложены другие массивы: <syntaxhighlight lang="lua"> array = {{a,b},{c,d}} --[[ массив из двух массивов (подмассивов) содержащие а и b в одном и c и d в другом--]] print(array[1][1]) --[[a так как мы сначала выберем первый массив {a,b} а из него первый элемент a --]] </syntaxhighlight>Мы разобрали наиболее элементарные типы данных в Lua. Другие типы данных являются специфичными и мы их рассмотрим в следующих главах. == Приведение типов. == Как мы говорили ранее, 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> == Действия с переменными == С переменными (а вернее, только с числовыми переменными) можно проводить арифметические операции:<syntaxhighlight lang="lua"> a = 5 b = 10 -- Сложение print(a + b) --> 15 -- Отрицание print(a - b) --> -5 -- Умножение print(a * b) --> 50 -- Деление print(b/a) --> 2 -- Деление от остатка print(5%2) --> 1 (если вы разделите 5 на 2 вы получите 2 с остатком 1) -- Возведение в степень print(5^2) --> 25 -- Корень от числа print(25^(1/2)) --> 5 </syntaxhighlight>Операции сравнения всегда возвращают значение типа boolean: <syntaxhighlight lang="lua"> a = 5 b = 10 -- Строго больше/меньше print(a>b) --> false (на самом деле b > a) -- Больше/меньше или равно (в отличии от прошлого, равенство вернет true) print(b >= a) --> true print(b >= b) --> true print(b > b) --> false -- Равенство print(b == b) --> true -- Неравенство print(b ~= b) --> false </syntaxhighlight>Что интересно, в отличии от арифметических действий, операции сравнений можно использовать и при работе со строками. Строки сравниваются в алфавитном порядке:<syntaxhighlight lang="lua"> print("a" < "b") --> true </syntaxhighlight>Если же вы хотите использовать более сложные конструкции из арифметических выражений, то вам либо придется использовать скобки, либо запомнить следующую список приоритетов: приоритет операции понижается сверху вниз * ^ * -, not, # * %,*,/ * +,- * .. * Операции сравнения * and * or Думаю, вы заметили, что приоритеты операций совпадают с приоритетом операций в математике. И все же, если у вас есть сомнения в том, какая операция имеет больший приоритет, то рекомендуем использовать скобки - это улучшит читаемость кода. == Логические операции == В Lua существует 3 логические операции: and (и), or(или), not (нет). Результат этих операций - false или true. Фактически, они сравнивают истинность двух выражений. Первое, что мы рассмотрим - and: возвращает true, только когда оба выражения являются истинными:<syntaxhighlight lang="lua"> print(true and true) --> true (и то, и то - истина) print(true and false) --> false (истина только одна, а должны быть истины все) </syntaxhighlight>Второе - or. Он возвращает true, когда хотя бы одно из выражений является истинной:<syntaxhighlight lang="lua"> print(true or false) --> true (одна истина уже есть) print(false or false) --> false (нет истинного выражения) </syntaxhighlight>И третье - not. Возвращает отрицание выражения: если исходное выражение было истиной, то благодаря not оно станет ложным:<syntaxhighlight lang="lua"> print(not true) --> false </syntaxhighlight>А теперь сделаем некоторые замечания: под true/false могут быть любые выражения, которые могут оказаться boolean, например: 2+2 == 4. Второе важное замечание - это приоритеты выражений: если мы захотим сравнить что-то более сложное, например a and b or c, то у нас могут возникнуть проблемы из-за интерпретации этого выражения. And всегда имеет больший приоритет над or: сначала будет сравниваться b или с, а потом итог прошлого выражения и а. Чтобы сделать выражение иным, мы можем использовать такую запись: (a and b) or c. 1d3op6xu1at9vfd7v4nzrj8ml8szhb6 270398 270397 2026-10-21T07:44:02Z Maaqqw 77294 /* Экранированные последовательности */ 270398 wikitext text/x-wiki {{Навигация учебника|Содержание = Да}} == Еще раз о Lua == Мы говорили, что Lua сильно похож на [[Python]]. Еще одна общая особенность для двух данных языков- динамическая типизация. Динамическая типизация в данных языках позволяет изменить типы переменных: из числа можно сделать строку, а из строки число; а сами типы переменных определяются интерпретатором (в строго типизированных языках, тип переменной надо указывать заранее: в C++ целочисленную переменную можно создать таким образом - int a = 5). Сейчас мы разберемся подробнее, какую роль играет типизация и как работать с переменными. == Переменная какого типа? == Чтобы определить к какому типу относится переменная, можно использовать функцию type(). О функциях мы узнаем позже, но думаю, вы уже видите некоторые параллели функций type() и print(). И так, пример:<syntaxhighlight lang="lua"> type(15) --> number type(str) --> nil type ("str") --> string </syntaxhighlight>Как мы видим, функция type() говорит нам, что наши значения - число, nil, строка соответственно. Интересное замечание: сама функция type() возвращает строку == Типы данных в Lua == В Lua есть 8 базовых (то есть встроенных в сам язык) типов: number(число), string(строка), boolean(логический тип), nil (тип "ничего"), table,function, userdata, thread. Пришло время разобраться в каждом из них. === number(число) === Что разительно отличает Lua от других языков - существование только одного типа данных для чисел и это - number. Любые числа будут number:<syntaxhighlight lang="lua"> -- Пример 1 a = 5 type(a) --> number -- Пример 2 a = 5.111 --> 5,111 индентично type(a) --> number -- Пример 3 a = 5E+6 --> 5e+6 индентично type(a) --> number print(a) --> 5 000 000 </syntaxhighlight>Если мы рассмотрим первый пример, то в других языках это бы называлось integer, то есть, целым числом. Второй пример: float или double (то есть число с плавающей точкой) в других языках. Заметим, что различие между точкой и запятой в Lua не делается - это все числа. Числа можно записывать не в десятичной системе счисления, но и в шестнадцатеричной:<syntaxhighlight lang="lua"> type(0xFFFF) --> number print(0xFFFF) --> 65535 </syntaxhighlight> === nil === Как мы уже писали ранее, тип nil является ничем. Он создан для того, что показывать, что в переменной нет ничего (а как мы видели ранее, "нет переменной").<syntaxhighlight lang="lua" line="1"> print(a) --> nil, так как переменной а - не существует a = 5 print(a) --> 5 a = nil --> эксперимент: зададим другое значение a print(a) --> nil </syntaxhighlight>Посмотрите на строку 4: здесь проявилось свойство динамической типизации - мы смогли превратить "a" у которой был тип number в "а", у которой тип nil. В таких языках как Lua, Python, Ruby, переопределить переменную достаточно просто. В отличии от C++ или Java. А теперь посмотрите на последнюю, 5-ую строку: переопределив "а" в nil, мы, фактически, уничтожили переменную "a". === string === Тип string представляет из себя последовательность символов (в других языках программирования символы имеют свой тип - char). Под символами (опять же, в других языках программирования) подразумевается одна буква, например, 'l', 'u' или 'a'. Вместе они образуют слово "lua", которое имеет тип string. Но вернемся к Lua: в этом языке нет типа char, а значит любое слово (обрамленное одинарными или двойными кавычками) будет является string. Мы разобрались с тем, что одинарные и двойные кавычки работают только в одной строке. Но как нам разместить многострочный текст? Для этого используются <nowiki>[[ ... ]]</nowiki><syntaxhighlight lang="lua"> a = "Wiki books" --> здесь произойдет ошибка a = [[ Wikipedia and Wikibooks ]] --> отобразится корректно </syntaxhighlight> Заметим, что string является неизменяемым типом: вы не можете заменить определенный символ в строке на другой. Тем не менее, вы можете работать над строкой используя функции:<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 a = "Wikibooks" print(#a) --> 9 </syntaxhighlight> ==== Экранированные последовательности ==== {| class="wikitable" |+ !Символ !Описание |- |\n |Перевод на новую строку |- |\\ |Обратный слеш (\) |- |\" |Двойная кавычка |- |\' |Одинарная кавычка |- |\[ |Открывающая квадратная скобка |- |\] |Закрывающая квадратная скобка |- |\_ |Нижнее подчёркивание |} === boolean === Тип boolean может принимать два значения - true (истина) или false (ложь). Конечно же, мы можем задать их в переменной, но чаще это не имеет смысла, так как наиболее частые случаи использования boolean - условные конструкции, где проще использовать операторы сравнения (которые и будут возвращать boolean). Истина возращается тогда, когда выражение является истинным (2+2 == 4 или 2+2 ~= 4), ложь является противоположным значением. === table === Тип table переставляет из себя ассоциативный массив (или словарь, если сравнивать с Python). Под массивом, мы могли бы понимать некий набор переменных. А если же говорить о ассоциативном массиве, то у переменных есть "ассоциация", то есть название, или правильнее - ключ. Есть еще последовательность: массив, ключи которого представляют из себя последовательные натуральные числа (от 1 до n, где n - последний ключ массива). В этом случае правильно было бы сказать, что в последовательности ключи являются индексами. Чтобы создать тип 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>Хочу заметить, что такой способ можно использовать только когда вы представили ключ в виде строки. Символ # представляет из себя длину строки. Но в случае с таблицей - это ее длина (а вернее, количество элементов в ней). Соответственно, мы можем совершать следующие операции:<syntaxhighlight lang="lua"> -- Пусть есть некий массив а a = {} print(a[#a]) --> напечает последний элемент (#a - значение последнего индекса для массива) a[#a+1] = 15 --> добавляет еще один элемент в конец массива </syntaxhighlight> Существуют и другие способы создания таблицы. Первый из них - создание последовательности(или его еще называют - список): <syntaxhighlight lang="lua"> a = {"Wikipedia", "Wikibooks", "Wikiversity"} --> Создали в этот раз непустой список print(a[2]) --> Wikibooks </syntaxhighlight>Хочу заметить, что счет индексов в Lua начинается с 1, а не с 0 как в других языках программирования: именно поэтому мы получили Wikibooks,а не Wikiversity как могло произойти в других языках программирования. Можно создать и такой массив с ключ/значением (их в Python называют словарем): <syntaxhighlight lang="lua"> array = {a = 1, b = 2} print(array[b]) --> nil </syntaxhighlight>Последнее, что мы рассмотрим для таблицы в этой главе - это многомерные массивы. Многомерные массивы - массивы, в которых могут быть вложены другие массивы: <syntaxhighlight lang="lua"> array = {{a,b},{c,d}} --[[ массив из двух массивов (подмассивов) содержащие а и b в одном и c и d в другом--]] print(array[1][1]) --[[a так как мы сначала выберем первый массив {a,b} а из него первый элемент a --]] </syntaxhighlight>Мы разобрали наиболее элементарные типы данных в Lua. Другие типы данных являются специфичными и мы их рассмотрим в следующих главах. == Приведение типов. == Как мы говорили ранее, 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> == Действия с переменными == С переменными (а вернее, только с числовыми переменными) можно проводить арифметические операции:<syntaxhighlight lang="lua"> a = 5 b = 10 -- Сложение print(a + b) --> 15 -- Отрицание print(a - b) --> -5 -- Умножение print(a * b) --> 50 -- Деление print(b/a) --> 2 -- Деление от остатка print(5%2) --> 1 (если вы разделите 5 на 2 вы получите 2 с остатком 1) -- Возведение в степень print(5^2) --> 25 -- Корень от числа print(25^(1/2)) --> 5 </syntaxhighlight>Операции сравнения всегда возвращают значение типа boolean: <syntaxhighlight lang="lua"> a = 5 b = 10 -- Строго больше/меньше print(a>b) --> false (на самом деле b > a) -- Больше/меньше или равно (в отличии от прошлого, равенство вернет true) print(b >= a) --> true print(b >= b) --> true print(b > b) --> false -- Равенство print(b == b) --> true -- Неравенство print(b ~= b) --> false </syntaxhighlight>Что интересно, в отличии от арифметических действий, операции сравнений можно использовать и при работе со строками. Строки сравниваются в алфавитном порядке:<syntaxhighlight lang="lua"> print("a" < "b") --> true </syntaxhighlight>Если же вы хотите использовать более сложные конструкции из арифметических выражений, то вам либо придется использовать скобки, либо запомнить следующую список приоритетов: приоритет операции понижается сверху вниз * ^ * -, not, # * %,*,/ * +,- * .. * Операции сравнения * and * or Думаю, вы заметили, что приоритеты операций совпадают с приоритетом операций в математике. И все же, если у вас есть сомнения в том, какая операция имеет больший приоритет, то рекомендуем использовать скобки - это улучшит читаемость кода. == Логические операции == В Lua существует 3 логические операции: and (и), or(или), not (нет). Результат этих операций - false или true. Фактически, они сравнивают истинность двух выражений. Первое, что мы рассмотрим - and: возвращает true, только когда оба выражения являются истинными:<syntaxhighlight lang="lua"> print(true and true) --> true (и то, и то - истина) print(true and false) --> false (истина только одна, а должны быть истины все) </syntaxhighlight>Второе - or. Он возвращает true, когда хотя бы одно из выражений является истинной:<syntaxhighlight lang="lua"> print(true or false) --> true (одна истина уже есть) print(false or false) --> false (нет истинного выражения) </syntaxhighlight>И третье - not. Возвращает отрицание выражения: если исходное выражение было истиной, то благодаря not оно станет ложным:<syntaxhighlight lang="lua"> print(not true) --> false </syntaxhighlight>А теперь сделаем некоторые замечания: под true/false могут быть любые выражения, которые могут оказаться boolean, например: 2+2 == 4. Второе важное замечание - это приоритеты выражений: если мы захотим сравнить что-то более сложное, например a and b or c, то у нас могут возникнуть проблемы из-за интерпретации этого выражения. And всегда имеет больший приоритет над or: сначала будет сравниваться b или с, а потом итог прошлого выражения и а. Чтобы сделать выражение иным, мы можем использовать такую запись: (a and b) or c. l8kuv45vfd55mypsuzuw1j6os28xfjq 270399 270398 2026-10-21T07:57:03Z Maaqqw 77294 /* Действия с переменными */ 270399 wikitext text/x-wiki {{Навигация учебника|Содержание = Да}} == Еще раз о Lua == Мы говорили, что Lua сильно похож на [[Python]]. Еще одна общая особенность для двух данных языков- динамическая типизация. Динамическая типизация в данных языках позволяет изменить типы переменных: из числа можно сделать строку, а из строки число; а сами типы переменных определяются интерпретатором (в строго типизированных языках, тип переменной надо указывать заранее: в C++ целочисленную переменную можно создать таким образом - int a = 5). Сейчас мы разберемся подробнее, какую роль играет типизация и как работать с переменными. == Переменная какого типа? == Чтобы определить к какому типу относится переменная, можно использовать функцию type(). О функциях мы узнаем позже, но думаю, вы уже видите некоторые параллели функций type() и print(). И так, пример:<syntaxhighlight lang="lua"> type(15) --> number type(str) --> nil type ("str") --> string </syntaxhighlight>Как мы видим, функция type() говорит нам, что наши значения - число, nil, строка соответственно. Интересное замечание: сама функция type() возвращает строку == Типы данных в Lua == В Lua есть 8 базовых (то есть встроенных в сам язык) типов: number(число), string(строка), boolean(логический тип), nil (тип "ничего"), table,function, userdata, thread. Пришло время разобраться в каждом из них. === number(число) === Что разительно отличает Lua от других языков - существование только одного типа данных для чисел и это - number. Любые числа будут number:<syntaxhighlight lang="lua"> -- Пример 1 a = 5 type(a) --> number -- Пример 2 a = 5.111 --> 5,111 индентично type(a) --> number -- Пример 3 a = 5E+6 --> 5e+6 индентично type(a) --> number print(a) --> 5 000 000 </syntaxhighlight>Если мы рассмотрим первый пример, то в других языках это бы называлось integer, то есть, целым числом. Второй пример: float или double (то есть число с плавающей точкой) в других языках. Заметим, что различие между точкой и запятой в Lua не делается - это все числа. Числа можно записывать не в десятичной системе счисления, но и в шестнадцатеричной:<syntaxhighlight lang="lua"> type(0xFFFF) --> number print(0xFFFF) --> 65535 </syntaxhighlight> === nil === Как мы уже писали ранее, тип nil является ничем. Он создан для того, что показывать, что в переменной нет ничего (а как мы видели ранее, "нет переменной").<syntaxhighlight lang="lua" line="1"> print(a) --> nil, так как переменной а - не существует a = 5 print(a) --> 5 a = nil --> эксперимент: зададим другое значение a print(a) --> nil </syntaxhighlight>Посмотрите на строку 4: здесь проявилось свойство динамической типизации - мы смогли превратить "a" у которой был тип number в "а", у которой тип nil. В таких языках как Lua, Python, Ruby, переопределить переменную достаточно просто. В отличии от C++ или Java. А теперь посмотрите на последнюю, 5-ую строку: переопределив "а" в nil, мы, фактически, уничтожили переменную "a". === string === Тип string представляет из себя последовательность символов (в других языках программирования символы имеют свой тип - char). Под символами (опять же, в других языках программирования) подразумевается одна буква, например, 'l', 'u' или 'a'. Вместе они образуют слово "lua", которое имеет тип string. Но вернемся к Lua: в этом языке нет типа char, а значит любое слово (обрамленное одинарными или двойными кавычками) будет является string. Мы разобрались с тем, что одинарные и двойные кавычки работают только в одной строке. Но как нам разместить многострочный текст? Для этого используются <nowiki>[[ ... ]]</nowiki><syntaxhighlight lang="lua"> a = "Wiki books" --> здесь произойдет ошибка a = [[ Wikipedia and Wikibooks ]] --> отобразится корректно </syntaxhighlight> Заметим, что string является неизменяемым типом: вы не можете заменить определенный символ в строке на другой. Тем не менее, вы можете работать над строкой используя функции:<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 a = "Wikibooks" print(#a) --> 9 </syntaxhighlight> ==== Экранированные последовательности ==== {| class="wikitable" |+ !Символ !Описание |- |\n |Перевод на новую строку |- |\\ |Обратный слеш (\) |- |\" |Двойная кавычка |- |\' |Одинарная кавычка |- |\[ |Открывающая квадратная скобка |- |\] |Закрывающая квадратная скобка |- |\_ |Нижнее подчёркивание |} === boolean === Тип boolean может принимать два значения - true (истина) или false (ложь). Конечно же, мы можем задать их в переменной, но чаще это не имеет смысла, так как наиболее частые случаи использования boolean - условные конструкции, где проще использовать операторы сравнения (которые и будут возвращать boolean). Истина возращается тогда, когда выражение является истинным (2+2 == 4 или 2+2 ~= 4), ложь является противоположным значением. === table === Тип table переставляет из себя ассоциативный массив (или словарь, если сравнивать с Python). Под массивом, мы могли бы понимать некий набор переменных. А если же говорить о ассоциативном массиве, то у переменных есть "ассоциация", то есть название, или правильнее - ключ. Есть еще последовательность: массив, ключи которого представляют из себя последовательные натуральные числа (от 1 до n, где n - последний ключ массива). В этом случае правильно было бы сказать, что в последовательности ключи являются индексами. Чтобы создать тип 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>Хочу заметить, что такой способ можно использовать только когда вы представили ключ в виде строки. Символ # представляет из себя длину строки. Но в случае с таблицей - это ее длина (а вернее, количество элементов в ней). Соответственно, мы можем совершать следующие операции:<syntaxhighlight lang="lua"> -- Пусть есть некий массив а a = {} print(a[#a]) --> напечает последний элемент (#a - значение последнего индекса для массива) a[#a+1] = 15 --> добавляет еще один элемент в конец массива </syntaxhighlight> Существуют и другие способы создания таблицы. Первый из них - создание последовательности(или его еще называют - список): <syntaxhighlight lang="lua"> a = {"Wikipedia", "Wikibooks", "Wikiversity"} --> Создали в этот раз непустой список print(a[2]) --> Wikibooks </syntaxhighlight>Хочу заметить, что счет индексов в Lua начинается с 1, а не с 0 как в других языках программирования: именно поэтому мы получили Wikibooks,а не Wikiversity как могло произойти в других языках программирования. Можно создать и такой массив с ключ/значением (их в Python называют словарем): <syntaxhighlight lang="lua"> array = {a = 1, b = 2} print(array[b]) --> nil </syntaxhighlight>Последнее, что мы рассмотрим для таблицы в этой главе - это многомерные массивы. Многомерные массивы - массивы, в которых могут быть вложены другие массивы: <syntaxhighlight lang="lua"> array = {{a,b},{c,d}} --[[ массив из двух массивов (подмассивов) содержащие а и b в одном и c и d в другом--]] print(array[1][1]) --[[a так как мы сначала выберем первый массив {a,b} а из него первый элемент a --]] </syntaxhighlight>Мы разобрали наиболее элементарные типы данных в Lua. Другие типы данных являются специфичными и мы их рассмотрим в следующих главах. == Приведение типов. == Как мы говорили ранее, 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> == Действия с переменными == С переменными (а вернее, только с числовыми переменными) можно проводить арифметические операции:<syntaxhighlight lang="lua"> a = 5 b = 10 -- Сложение print(a + b) --> 15 -- Отрицание print(a - b) --> -5 -- Умножение print(a * b) --> 50 -- Деление print(b/a) --> 2 -- Остаток от деления print(5%2) --> 1 (если вы разделите 5 на 2 вы получите 2 с остатком 1) -- Возведение в степень print(5^2) --> 25 -- Корень от числа print(25^(1/2)) --> 5 </syntaxhighlight>Операции сравнения всегда возвращают значение типа boolean: <syntaxhighlight lang="lua"> a = 5 b = 10 -- Строго больше/меньше print(a>b) --> false (на самом деле b > a) -- Больше/меньше или равно (в отличии от прошлого, равенство вернет true) print(b >= a) --> true print(b >= b) --> true print(b > b) --> false -- Равенство print(b == b) --> true -- Неравенство print(b ~= b) --> false </syntaxhighlight>Что интересно, в отличии от арифметических действий, операции сравнений можно использовать и при работе со строками. Строки сравниваются в алфавитном порядке:<syntaxhighlight lang="lua"> print("a" < "b") --> true </syntaxhighlight>Если же вы хотите использовать более сложные конструкции из арифметических выражений, то вам либо придется использовать скобки, либо запомнить следующую список приоритетов: приоритет операции понижается сверху вниз * ^ * -, not, # * %,*,/ * +,- * .. * Операции сравнения * and * or Думаю, вы заметили, что приоритеты операций совпадают с приоритетом операций в математике. И все же, если у вас есть сомнения в том, какая операция имеет больший приоритет, то рекомендуем использовать скобки - это улучшит читаемость кода. == Логические операции == В Lua существует 3 логические операции: and (и), or(или), not (нет). Результат этих операций - false или true. Фактически, они сравнивают истинность двух выражений. Первое, что мы рассмотрим - and: возвращает true, только когда оба выражения являются истинными:<syntaxhighlight lang="lua"> print(true and true) --> true (и то, и то - истина) print(true and false) --> false (истина только одна, а должны быть истины все) </syntaxhighlight>Второе - or. Он возвращает true, когда хотя бы одно из выражений является истинной:<syntaxhighlight lang="lua"> print(true or false) --> true (одна истина уже есть) print(false or false) --> false (нет истинного выражения) </syntaxhighlight>И третье - not. Возвращает отрицание выражения: если исходное выражение было истиной, то благодаря not оно станет ложным:<syntaxhighlight lang="lua"> print(not true) --> false </syntaxhighlight>А теперь сделаем некоторые замечания: под true/false могут быть любые выражения, которые могут оказаться boolean, например: 2+2 == 4. Второе важное замечание - это приоритеты выражений: если мы захотим сравнить что-то более сложное, например a and b or c, то у нас могут возникнуть проблемы из-за интерпретации этого выражения. And всегда имеет больший приоритет над or: сначала будет сравниваться b или с, а потом итог прошлого выражения и а. Чтобы сделать выражение иным, мы можем использовать такую запись: (a and b) or c. 2ygxxj2fgr2lk9yqpx2a8z66ad01c1y Айнский язык/Фонетика, фонология и орфография 0 30504 270390 236547 2026-10-20T16:17:50Z Procyon lotor lotor 79952 /* Консонантизм */ 270390 wikitext text/x-wiki Фонемный инвентарь айнского языка отличается от таковых расположенных в непосредственной близости языков по следующим факторам: * Согласные смычные в айнском не противопоставляются по звонкости-глухости * [...] ==Консонантизм== В айнском наличествует 12 согласных фонем. {| class="wikitable" ! !Лабиальные !Дентальные !Постальвеолярные !Велярные !Глоттальные |- |Назальные |style="text-align:center" | m |style="text-align:center" | n | | | |- |Взрывные |style="text-align:center" | p |style="text-align:center" | t | |style="text-align:center" | k |style="text-align:center" | (ʔ) |- |Аффрикаты |style="text-align:center" | t͡s | | | | |- |Фрикативные | |style="text-align:center" | s |style="text-align:center" | (ʃ) | |style="text-align:center" | h |- |Аппроксиманты |style="text-align:center" | w |style="text-align:center" | l |style="text-align:center" | j | | |- |Одноударный/Дрожащий | |style="text-align:center" | ɾ | | | |} Примечания к таблице: * [ʃ] является аллофоном [s] после гласной [i], а также в позиции на концах фонологических слов; [ʔ] выступает в качестве анлаута в тех словах, что на письме начинаются с гласной буквы (так, слово "itak" на самом деле читается как [ʔitak]). * фонема [t͡s] в большинстве диалектов айнского звучит сходно с русским "ц" в слове "цапля", однако в ряде фонологических контекстов ([...]), ее звучание сближается со смягченным подобием "ч" как в, например, "чайка". ==Вокализм== Гласные айнского соответствуют распространенной кросслингвистически пятифонемной системе. {| class="wikitable" ! !Передние !Средние !Задние |- |Верхние |style="text-align:center" | i | |style="text-align:center" | u |- |Средние |style="text-align:center" | e | |style="text-align:center" | o |- |Нижние | |style="text-align:center" | a | |} ===Сингармонизм=== Все гласные фонемы в айнском языке входят в одну из трёх сингармонических групп: A (/a/, /u/), B (/o/) или C (/e/, /i/). Гласные группы A не могут (за рядом исключений) сосуществовать в одном фонетическом слове с /o/, являющейся единственной гласной группы B. Гласные группы C являются нейтральными и могут быть обнаружены вместе с фонемами как группы A, так и группы B. Группа последней гласной корня определяют группу, которую принимают гласные наростаемых к нему аффиксов. ===Оглушение=== В позиции между двумя глухими согласными, фонемы /i/, /u/ и /o/ оглушаются: /cise/ -> [ci̥se]. ==Просодия== Ударение в словах айнского языка падает на первый слог корня если он открытый и не содержит дифтонгов, на второй же если эти требования не удовлетворены. ==Айнская катакана== В настоящее время для записи айнского применяется модифицированная версия японской катаканы. bw6lc4jchuyeic3uitvyxtir9f6ehax 270391 270390 2026-10-20T16:20:56Z Procyon lotor lotor 79952 /* Консонантизм */ 270391 wikitext text/x-wiki Фонемный инвентарь айнского языка отличается от таковых расположенных в непосредственной близости языков по следующим факторам: * Согласные смычные в айнском не противопоставляются по звонкости-глухости * [...] ==Консонантизм== В айнском наличествует 12 согласных фонем. {| class="wikitable" ! !Лабиальные !Дентальные !Постальвеолярные !Велярные !Глоттальные |- |Назальные |style="text-align:center" | m |style="text-align:center" | n | | | |- |Взрывные |style="text-align:center" | p |style="text-align:center" | t | |style="text-align:center" | k |style="text-align:center" | (ʔ) |- |Аффрикаты | |style="text-align:center" | t͡s / t͡ʃ | | | |- |Фрикативные | |style="text-align:center" | s |style="text-align:center" | (ʃ) | |style="text-align:center" | h |- |Аппроксиманты |style="text-align:center" | w |style="text-align:center" | l |style="text-align:center" | j | | |- |Одноударный/Дрожащий | |style="text-align:center" | ɾ | | | |} Примечания к таблице: * [ʃ] является аллофоном [s] после гласной [i], а также в позиции на концах фонологических слов; [ʔ] выступает в качестве анлаута в тех словах, что на письме начинаются с гласной буквы (так, слово "itak" на самом деле читается как [ʔitak]). * фонема [t͡s] в большинстве диалектов айнского звучит сходно с русским "ц" в слове "цапля", однако в ряде фонологических контекстов ([...]), ее звучание сближается со смягченным подобием "ч" как в, например, "чайка". ==Вокализм== Гласные айнского соответствуют распространенной кросслингвистически пятифонемной системе. {| class="wikitable" ! !Передние !Средние !Задние |- |Верхние |style="text-align:center" | i | |style="text-align:center" | u |- |Средние |style="text-align:center" | e | |style="text-align:center" | o |- |Нижние | |style="text-align:center" | a | |} ===Сингармонизм=== Все гласные фонемы в айнском языке входят в одну из трёх сингармонических групп: A (/a/, /u/), B (/o/) или C (/e/, /i/). Гласные группы A не могут (за рядом исключений) сосуществовать в одном фонетическом слове с /o/, являющейся единственной гласной группы B. Гласные группы C являются нейтральными и могут быть обнаружены вместе с фонемами как группы A, так и группы B. Группа последней гласной корня определяют группу, которую принимают гласные наростаемых к нему аффиксов. ===Оглушение=== В позиции между двумя глухими согласными, фонемы /i/, /u/ и /o/ оглушаются: /cise/ -> [ci̥se]. ==Просодия== Ударение в словах айнского языка падает на первый слог корня если он открытый и не содержит дифтонгов, на второй же если эти требования не удовлетворены. ==Айнская катакана== В настоящее время для записи айнского применяется модифицированная версия японской катаканы. bf88qg3rpwnmr6cktzyh5yyzok4fe6z 270392 270391 2026-10-20T16:27:34Z Procyon lotor lotor 79952 /* Оглушение */ 270392 wikitext text/x-wiki Фонемный инвентарь айнского языка отличается от таковых расположенных в непосредственной близости языков по следующим факторам: * Согласные смычные в айнском не противопоставляются по звонкости-глухости * [...] ==Консонантизм== В айнском наличествует 12 согласных фонем. {| class="wikitable" ! !Лабиальные !Дентальные !Постальвеолярные !Велярные !Глоттальные |- |Назальные |style="text-align:center" | m |style="text-align:center" | n | | | |- |Взрывные |style="text-align:center" | p |style="text-align:center" | t | |style="text-align:center" | k |style="text-align:center" | (ʔ) |- |Аффрикаты | |style="text-align:center" | t͡s / t͡ʃ | | | |- |Фрикативные | |style="text-align:center" | s |style="text-align:center" | (ʃ) | |style="text-align:center" | h |- |Аппроксиманты |style="text-align:center" | w |style="text-align:center" | l |style="text-align:center" | j | | |- |Одноударный/Дрожащий | |style="text-align:center" | ɾ | | | |} Примечания к таблице: * [ʃ] является аллофоном [s] после гласной [i], а также в позиции на концах фонологических слов; [ʔ] выступает в качестве анлаута в тех словах, что на письме начинаются с гласной буквы (так, слово "itak" на самом деле читается как [ʔitak]). * фонема [t͡s] в большинстве диалектов айнского звучит сходно с русским "ц" в слове "цапля", однако в ряде фонологических контекстов ([...]), ее звучание сближается со смягченным подобием "ч" как в, например, "чайка". ==Вокализм== Гласные айнского соответствуют распространенной кросслингвистически пятифонемной системе. {| class="wikitable" ! !Передние !Средние !Задние |- |Верхние |style="text-align:center" | i | |style="text-align:center" | u |- |Средние |style="text-align:center" | e | |style="text-align:center" | o |- |Нижние | |style="text-align:center" | a | |} ===Сингармонизм=== Все гласные фонемы в айнском языке входят в одну из трёх сингармонических групп: A (/a/, /u/), B (/o/) или C (/e/, /i/). Гласные группы A не могут (за рядом исключений) сосуществовать в одном фонетическом слове с /o/, являющейся единственной гласной группы B. Гласные группы C являются нейтральными и могут быть обнаружены вместе с фонемами как группы A, так и группы B. Группа последней гласной корня определяют группу, которую принимают гласные наростаемых к нему аффиксов. ===Оглушение=== В позиции между двумя глухими согласными, фонемы /i/, /u/ и /o/ оглушаются: /t͡sise/ -> [t͡si̥se]. ==Просодия== Ударение в словах айнского языка падает на первый слог корня если он открытый и не содержит дифтонгов, на второй же если эти требования не удовлетворены. ==Айнская катакана== В настоящее время для записи айнского применяется модифицированная версия японской катаканы. 4jjdrpl9vuhcgna888dfxkq8t9v1qm3 Сэндвич 0 35903 270395 270342 2026-10-21T01:59:22Z Leksey 3027 Удалил энциклопедическую часть, автору запрос на СО отправил по поводу использования ИИ 270395 wikitext text/x-wiki Сэндвич - блюдо, которое представляет из себя разнообразную начинку, находящуюся между двумя ломтиками хлеба. == Рецепты популярных сэндвичей == === "Рубен" === '''Ингредиенты на один сэндвич:''' Для сэндвича: * Ржаной хлеб - 2 ломтика * Мясо (пастрами, прошутто, ветчина, окорок или сыровяленая говядина) - 80-100 г * Квашеная капуста - 2-3 ст. л с горкой * Сыр (грюйер, эмменталь или другой полутвердый) - 30-40 г * Сливочное масло для смазывания хлеба Для соуса: * Майонез - 1 ст. л * Хрен тертый - 1 ч. л * Кетчуп - 1 ст. л * Горчица - 1 ч. л * Паприка и сахар - по щепотке '''Процесс приготовления:''' В миске смешайте все ингредиенты для соуса. Его называют "русским соусом", и он должен получится однородным, с легкой кислинкой, остринкой и сладковатыми нотками. Внутренние стороны обоих кусков хлеба надо смазать маслом. Главное - не переборщить, а то сэндвич получится суховатым. Теперь сборка: смажьте соусом первый ломтик хлеба, положите на него мясо, поверх мяса - квашеную капусту, капусту засыпьте тертым или тонко нарезанным сыром. Смажьте второй кусок хлеба соусом и накройте начинку. Обжарьте сэндвич на среднем огне по 3-4 минуты с каждой стороны. Снимайте со сковороды и дайте сэндвичу немного постоять, и разрежьте по диагонали. === "BLT" === '''Ингредиенты:''' * Ломтики бекона - 3-4 небольших штучки * Тостовый хлеб - 2 ломтика * Листья салата * Помидор - 2-3 кружочка (толсто нарезанные) * Майонез - по желанию * Горчица - по желанию '''Процесс приготовления:''' Поджарьте хлеб в тостере и смажьте соусами (по желанию). Бекон обжарьте на среднем огне до хруста и коричневатого цвета. А можно и не очень хрустящий бекон, тоже выйдет вкусно. Теперь положите на хлеб помидоры. Традиционно для BLT используется сорт "Бычье сердце", но вы можете взять вообще любой, какой вам по душе. На помидоры - салат. Его надо промыть и охладить, а потом обсушить. Одного листа уже будет достаточно для добротного сэндвича. Тут как и с помидорами, можно выбрать любой сорт салата или капусты. На тарелку с бумажным полотенцем положите бекон, чтобы убрать лишний жир. А потом можно класть бекон на салат в любом количестве. Накройте вторым ломтиком хлеба. Готово! Можно съесть его прямо после готовности, а можно сделать двойной или даже тройной сэндвич. === "Монте-Кристо" === '''Ингредиенты для сэндвича:''' * Тостовый хлеб - 2 ломтика * Ветчина - 2 ломтика * Твердый или полутвердый сыр * Молоко * Яйца * Сахарная пудра и джем для подачи по желанию '''Процесс приготовления:''' Взбейте яйца и молоко, как на омлет или френч-тосты. На тостовый хлеб положите ветчину и кусочки сыра. Накройте другим хлебом. Слегка прижмите сэндвич. Окуните сэндвич в яичную смесь и обжарьте до готовности внешней яичной оболочки (как френч-тосты). При подаче можно по желанию посыпать сахарной пудрой и подать с джемом, это традиционный вариант. [[Категория:Учебники без шаблона]] mlvpqwvk8nfw2c3tk3v2yrpmjgdl2dt Обсуждение участника:Ferarchick new 3 35910 270394 2026-10-21T01:58:30Z Leksey 3027 Вопрос 270394 wikitext text/x-wiki Привет! По поводу публикации текста [[Сэндвич]]. Рецепт он вот тут [[Рецепт:Сэндвич]]. Вы написали статью для Википедии, но она там уже есть. И скажите, вы сами писали или это ИИ? [[Участник:Leksey|Leksey]] ([[Обсуждение участника:Leksey|обсуждение]]) 01:58, 21 октября 2026 (UTC) eh62y1mx0pg40zywsu86kf6teo9nts8