translate basics/lua

This commit is contained in:
Andrey Stepanov 2024-11-29 09:57:38 +05:00
parent c3e8ac8405
commit 25abb55ed3
Signed by: Koldun
GPG Key ID: 53DE683337F5D25F

View File

@ -1,55 +1,54 @@
--- ---
title: Lua Scripting title: Пишем на Lua
layout: default layout: default
root: ../.. root: ../..
idx: 1.2 idx: 1.2
description: A basic introduction to Lua, including a guide on global/local scope. description: Введение в Lua
redirect_from: /en/chapters/lua.html redirect_from: /ru/chapters/lua.html
--- ---
## Introduction <!-- omit in toc --> ## Введение <!-- omit in toc -->
In this chapter, you'll learn about scripting in Lua, the tools required В этой главе вы узнаете, как писать на Lua и какие для этого нужны инструменты.
to help with this, and some techniques that you may find useful. Также вы познакомитесь с некоторыми полезными техниками.
- [Programming](#programming) - [Программирование](#programming)
- [Coding in Lua](#coding-in-lua) - [Пишем на Lua](#coding-in-lua)
- [Code Editors](#code-editors) - [Редактор](#code-editors)
- [Local and Global Scope](#local-and-global-scope) - [Области видимости](#local-and-global-scope)
- [Locals should be used as much as possible](#locals-should-be-used-as-much-as-possible) - [Используйте локальные переменные везде](#locals-should-be-used-as-much-as-possible)
- [Including other Lua Scripts](#including-other-lua-scripts) - [Подключение других скриптов](#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 * [Codecademy](http://www.codecademy.com/) один из лучших ресурсов для обучения
learning to write code. It provides an interactive tutorial experience. программированию. Здесь есть интерактивные обучающие примеры.
* [Scratch](https://scratch.mit.edu) is a good resource for starting from * [Scratch](https://scratch.mit.edu) — хороший ресурс для того, чтобы начать
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 * [Programming with Mosh](https://www.youtube.com/user/programmingwithmosh)
a good YouTube series to learn programming. прекрасный YouTube-канал по обучению программированию.
### Coding in Lua ### Пишем на Lua
It's also beyond the scope of this book to teach Lua coding. Обучение вас программированию на Lua также не является целью этой книги.
The [Programming in Lua (PiL)](https://www.lua.org/pil/contents.html) book is an Рекомендую книгу [Programming in Lua (PiL)](https://www.lua.org/pil/contents.html) —
excellent introduction to Lua programming. она прекрасно подойдёт для входа в Lua.
## Code Editors ## Редактор
A code editor with code highlighting is sufficient for writing scripts in Lua. Текстовый редактор с подсветкой синтаксиса очень полезен при написании на Lua.
Code highlighting uses different colours for words and characters Слова и символы выделяются разными цветами в зависимости от их назначения. Это
depending on what they represent. This allows you to easily notice облегчает поиск ошибок и несоответствий.
mistakes and inconsistencies.
For example: Например:
```lua ```lua
function ctf.post(team,msg) function ctf.post(team,msg)
@ -67,24 +66,25 @@ function ctf.post(team,msg)
end end
``` ```
Keywords in this example are highlighted, including `if`, `then`, `end`, and `return`. В этом примере подсвечены ключевые слова, такие как: `if`, `then`, `end`
Functions which come with Lua by default, such as `table.insert`, are also highlighted. и `return`. Стандартные фукнции Lua, такие как `table.insert`, также будут
подсвечены.
Commonly used editors which are well-suited for Lua include: Широко используемые редакторы для Lua:
* [VSCode](https://code.visualstudio.com/): * [VSCode](https://code.visualstudio.com/):
open source (as Code-OSS or VSCodium), popular, and has открытй (как Code-OSS или VSCodium), популярный и к нему есть
[plugins for Minetest](https://marketplace.visualstudio.com/items?itemName=GreenXenith.minetest-tools). [плагин для Minetest](https://marketplace.visualstudio.com/items?itemName=GreenXenith.minetest-tools).
* [Notepad++](http://notepad-plus-plus.org/): simple, Windows-only * [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 ```lua
function one() function one()
@ -92,42 +92,43 @@ function one()
end end
function two() function two()
print(dump(foo)) -- Output: "bar" print(dump(foo)) -- Выведет сообщение: "bar"
end end
one() one()
two() 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 По умолчанию, все переменные в Lua глобальные, и вам необходимо явно помечать
`local` keyword: локальные переменные словом `local`.
```lua ```lua
-- Accessible from within this script file -- Доступна в любом месте этого файла
local one = 1 local one = 1
function myfunc() function myfunc()
-- Accessible from within this function -- Доступна только внутри этой функции
local two = one + one local two = one + one
if two == one then if two == one then
-- Accessible from within this if statement -- Доступна только внутри условного оператора
local three = one + two local three = one + two
end end
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 Assignment to undeclared global 'foo' inside function at init.lua:2
To correct this, use "local": Чтобы исправить это, используйте ключевое слово "local":
```lua ```lua
function one() function one()
@ -135,18 +136,19 @@ function one()
end end
function two() function two()
print(dump(foo)) -- Output: nil print(dump(foo)) -- Выведет сообщение: nil
end end
one() one()
two() two()
``` ```
Remember that nil means **not initialised**. The variable hasn't been assigned a Запомните, что "nil" означает **не инициализировано**: переменной ещё не было
value yet, doesn't exist, or has been uninitialised (meaning set to 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 ```lua
local function foo(bar) local function foo(bar)
@ -154,9 +156,9 @@ local function foo(bar)
end 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 ```lua
mymod = {} mymod = {}
@ -165,22 +167,23 @@ function mymod.foo(bar)
return "foo" .. bar return "foo" .. bar
end end
-- In another mod, or script: -- В другом моде или скрипте:
mymod.foo("foobar") mymod.foo("foobar")
``` ```
`function mymod.foo()` is equivalent to `mymod.foo = function()`, it's just a `function mymod.foo()` то же самое что и `mymod.foo = function()`, только
nicer way to write it. выглядит лучше.
## Including other Lua Scripts ## Подключение других скриптов
The recommended way to include other Lua scripts in a mod is to use *dofile*. Лучше всего подключать другие Lua-скрипты в мод с помощью функции *dofile*.
```lua ```lua
dofile(core.get_modpath("modname") .. "/script.lua") dofile(core.get_modpath("modname") .. "/script.lua")
``` ```
A script can return a value, which is useful for sharing private locals: Скрипт может веруть значение, через которое предоставит доступ к локальным
переменным:
```lua ```lua
-- script.lua -- script.lua
@ -193,5 +196,5 @@ local ret = dofile(core.get_modpath("modname") .. "/script.lua")
print(ret.message) -- Hello world! print(ret.message) -- Hello world!
``` ```
[Later chapters](../quality/clean_arch.html) will discuss how best to split up В [следующей главе](../quality/clean_arch.html) вы узнаете, как лучше всего
code for a mod. разбивать код мода.