translate basics/lua
This commit is contained in:
parent
c3e8ac8405
commit
25abb55ed3
@ -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.
|
разбивать код мода.
|
||||||
|
Loading…
Reference in New Issue
Block a user