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
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 <!-- omit in toc -->
## Введение <!-- omit in toc -->
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) вы узнаете, как лучше всего
разбивать код мода.