diff --git a/_ru/basics/lua.md b/_ru/basics/lua.md index 08acca8..f4602e5 100644 --- a/_ru/basics/lua.md +++ b/_ru/basics/lua.md @@ -1,55 +1,54 @@ --- -title: Lua Scripting +title: Пишем на Lua layout: default root: ../.. idx: 1.2 -description: A basic introduction to Lua, including a guide on global/local scope. -redirect_from: /en/chapters/lua.html +description: Введение в Lua +redirect_from: /ru/chapters/lua.html --- -## Introduction +## Введение -In this chapter, you'll learn about scripting in Lua, the tools required -to help with this, and some techniques that you may find useful. +В этой главе вы узнаете, как писать на Lua и какие для этого нужны инструменты. +Также вы познакомитесь с некоторыми полезными техниками. -- [Programming](#programming) - - [Coding in Lua](#coding-in-lua) -- [Code Editors](#code-editors) -- [Local and Global Scope](#local-and-global-scope) - - [Locals should be used as much as possible](#locals-should-be-used-as-much-as-possible) -- [Including other Lua Scripts](#including-other-lua-scripts) +- [Программирование](#programming) + - [Пишем на Lua](#coding-in-lua) +- [Редактор](#code-editors) +- [Области видимости](#local-and-global-scope) + - [Используйте локальные переменные везде](#locals-should-be-used-as-much-as-possible) +- [Подключение других скриптов](#including-other-lua-scripts) -## Programming +## Программирование -Programming is the action of taking a problem, such as sorting a list -of items, and turning it into steps that a computer can understand. -Teaching you the logical process of programming is beyond the scope of this book; -however, the following websites are quite useful in developing this: +Программирование — это когда вы берёте задачу (например, сортировка списка) +и превращаете её в простые шаги, который компьютер сможет выполнить. +Обучение вас программированию не является целью этой книги. Тем не менее, +эти сайты могут оказаться для вас полезными: -* [Codecademy](http://www.codecademy.com/) is one of the best resources for - learning to write code. It provides an interactive tutorial experience. -* [Scratch](https://scratch.mit.edu) is a good resource for starting from - absolute basics, and learning the problem-solving techniques required to program. - It's great for children and teenagers. -* [Programming with Mosh](https://www.youtube.com/user/programmingwithmosh) is - a good YouTube series to learn programming. +* [Codecademy](http://www.codecademy.com/) один из лучших ресурсов для обучения + программированию. Здесь есть интерактивные обучающие примеры. +* [Scratch](https://scratch.mit.edu) — хороший ресурс для того, чтобы начать + с самых основ и научиться технике решения задач в программировании. + Он отлично подойдёт детям и подросткам. +* [Programming with Mosh](https://www.youtube.com/user/programmingwithmosh) — + прекрасный YouTube-канал по обучению программированию. -### Coding in Lua +### Пишем на Lua -It's also beyond the scope of this book to teach Lua coding. -The [Programming in Lua (PiL)](https://www.lua.org/pil/contents.html) book is an -excellent introduction to Lua programming. +Обучение вас программированию на Lua также не является целью этой книги. +Рекомендую книгу [Programming in Lua (PiL)](https://www.lua.org/pil/contents.html) — +она прекрасно подойдёт для входа в Lua. -## Code Editors +## Редактор -A code editor with code highlighting is sufficient for writing scripts in Lua. -Code highlighting uses different colours for words and characters -depending on what they represent. This allows you to easily notice -mistakes and inconsistencies. +Текстовый редактор с подсветкой синтаксиса очень полезен при написании на Lua. +Слова и символы выделяются разными цветами в зависимости от их назначения. Это +облегчает поиск ошибок и несоответствий. -For example: +Например: ```lua function ctf.post(team,msg) @@ -67,24 +66,25 @@ function ctf.post(team,msg) end ``` -Keywords in this example are highlighted, including `if`, `then`, `end`, and `return`. -Functions which come with Lua by default, such as `table.insert`, are also highlighted. +В этом примере подсвечены ключевые слова, такие как: `if`, `then`, `end` +и `return`. Стандартные фукнции Lua, такие как `table.insert`, также будут +подсвечены. -Commonly used editors which are well-suited for Lua include: +Широко используемые редакторы для Lua: * [VSCode](https://code.visualstudio.com/): - open source (as Code-OSS or VSCodium), popular, and has - [plugins for Minetest](https://marketplace.visualstudio.com/items?itemName=GreenXenith.minetest-tools). -* [Notepad++](http://notepad-plus-plus.org/): simple, Windows-only + открытй (как Code-OSS или VSCodium), популярный и к нему есть + [плагин для Minetest](https://marketplace.visualstudio.com/items?itemName=GreenXenith.minetest-tools). +* [Notepad++](http://notepad-plus-plus.org/): простой, только для Windows. -Other suitable editors are also available. +Есть и множество других подходящих редакторов. -## Local and Global Scope +## Области видимости + +Переменные могут быть локальными и глобальными. К глобальным переменным можно +обращаться из любого места в скрипте и даже из другого мода. -Whether a variable is local or global determines where it can be written to or -read from. Global variables can be accessed from anywhere in the script file, -and from any other mod: ```lua function one() @@ -92,42 +92,43 @@ function one() end function two() - print(dump(foo)) -- Output: "bar" + print(dump(foo)) -- Выведет сообщение: "bar" end one() two() ``` -In constrast, a local variable is only accessible from where it is defined. -Lua defaults to variables being global, so you need to explicitly use the -`local` keyword: +Локальные же переменные доступны только там, где они объявлены. +По умолчанию, все переменные в Lua глобальные, и вам необходимо явно помечать +локальные переменные словом `local`. ```lua --- Accessible from within this script file +-- Доступна в любом месте этого файла local one = 1 function myfunc() - -- Accessible from within this function + -- Доступна только внутри этой функции local two = one + one if two == one then - -- Accessible from within this if statement + -- Доступна только внутри условного оператора local three = one + two end end ``` -### Locals should be used as much as possible +### Используйте локальные переменные везде -Local variables should be used whenever possible. Mods should only create one -global at most, with the same name as the mod. Creating other globals is sloppy -coding, and Minetest will warn about this: +Старайтесь использовать локальные переменные везде, где только можно. +Мод должен создавать только одну глобальную переменную с таким же именем, как +и у мода. Создание любых других глобальных переменных считается плохим тоном, +и Minetest будет предупреждать об этом сообщением: Assignment to undeclared global 'foo' inside function at init.lua:2 -To correct this, use "local": +Чтобы исправить это, используйте ключевое слово "local": ```lua function one() @@ -135,18 +136,19 @@ function one() end function two() - print(dump(foo)) -- Output: nil + print(dump(foo)) -- Выведет сообщение: nil end one() two() ``` -Remember that nil means **not initialised**. The variable hasn't been assigned a -value yet, doesn't exist, or has been uninitialised (meaning set to nil). +Запомните, что "nil" означает **не инициализировано**: переменной ещё не было +присвоено значение, перменная не существует или была удалена (было присвоено +значение nil). -Functions are variables of a special type, but should also be made local, -because other mods could have functions with the same names. +Функции — это особый тип переменных, но они также должны быть объявлены +локально, ведь в других модах могут оказаться свои функции с такими же именами. ```lua local function foo(bar) @@ -154,9 +156,9 @@ local function foo(bar) end ``` -To allow mods to call your functions, you should create a table with the same -name as the mod and add your function to it. This table is often called an API -table or namespace. +Чтобы позволить другим модам вызывать ваши функции, необходимо создать таблицу +с таким же именем, как у вашего мода, и добавить в неё нужные функции. +Такая таблица обычно называется "API мода" или namespace. ```lua mymod = {} @@ -165,22 +167,23 @@ function mymod.foo(bar) return "foo" .. bar end --- In another mod, or script: +-- В другом моде или скрипте: mymod.foo("foobar") ``` -`function mymod.foo()` is equivalent to `mymod.foo = function()`, it's just a -nicer way to write it. +`function mymod.foo()` то же самое что и `mymod.foo = function()`, только +выглядит лучше. -## Including other Lua Scripts +## Подключение других скриптов -The recommended way to include other Lua scripts in a mod is to use *dofile*. +Лучше всего подключать другие Lua-скрипты в мод с помощью функции *dofile*. ```lua dofile(core.get_modpath("modname") .. "/script.lua") ``` -A script can return a value, which is useful for sharing private locals: +Скрипт может веруть значение, через которое предоставит доступ к локальным +переменным: ```lua -- script.lua @@ -193,5 +196,5 @@ local ret = dofile(core.get_modpath("modname") .. "/script.lua") print(ret.message) -- Hello world! ``` -[Later chapters](../quality/clean_arch.html) will discuss how best to split up -code for a mod. +В [следующей главе](../quality/clean_arch.html) вы узнаете, как лучше всего +разбивать код мода.