Параметры и возвращаемые значения
Функции всегда делали одно и то же. Но что если нужна функция которая копает тоннель разной длины? Или считает расстояние между разными точками?
Для этого функции принимают параметры — данные переданные снаружи. И возвращают результат — значение, которое можно использовать дальше.
Параметры
Параметры — это переменные, которые функция получает при вызове:
local function greet(name)
print("Привет, " .. name .. "!")
end
greet("Никита") -- Привет, Никита!
greet("Мир") -- Привет, Мир!
Внутри функции name — обычная локальная переменная. При каждом вызове она получает новое значение.
Несколько параметров
local function move(steps, direction)
for i = 1, steps do
if direction == "forward" then turtle.forward()
elseif direction == "up" then turtle.up()
elseif direction == "down" then turtle.down()
end
end
end
move(10, "forward")
move(5, "up")
move(3, "down")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
local function digTunnel(length, height)
for i = 1, length do
for h = 1, height do
if h == 1 then
turtle.dig()
turtle.forward()
else
turtle.digUp()
turtle.up()
end
end
-- опускаемся обратно
for h = 1, height - 1 do
turtle.down()
end
end
end
digTunnel(20, 2) -- тоннель 20 блоков, высота 2
digTunnel(50, 3) -- тоннель 50 блоков, высота 3
Возвращаемые значения: return
return завершает функцию и возвращает значение вызывающему коду:
local function fuelNeeded(distance)
return distance * 1 -- 1 единица топлива на блок
end
local dist = 150
local fuel = fuelNeeded(dist)
print("Нужно топлива: " .. fuel)
local function max(a, b)
if a > b then
return a
else
return b
end
end
print(max(10, 25)) -- 25
print(max(100, 7)) -- 100
Несколько возвращаемых значений
В Lua функция может вернуть сразу несколько значений через запятую:
local function minMax(a, b, c)
local minimum = math.min(a, b, c)
local maximum = math.max(a, b, c)
return minimum, maximum
end
local lo, hi = minMax(5, 2, 8)
print("Мин: " .. lo .. ", Макс: " .. hi) -- Мин: 2, Макс: 8
Именно так работают многие встроенные функции ComputerCraft:
local ok, data = turtle.inspect() -- два значения
local x, y, z = gps.locate() -- три значения
local success, err = pcall(func) -- два значения
return прерывает выполнение функции
return не только возвращает значение — он немедленно завершает функцию. Это используют для ранних выходов:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local function safeDig()
if turtle.getFuelLevel() == 0 then
print("Нет топлива!")
return false -- выходим сразу
end
if not turtle.detect() then
return false -- копать нечего
end
turtle.dig()
return true -- успешно скопали
end
if safeDig() then
turtle.forward()
end
Параметры по умолчанию
Lua не поддерживает параметры по умолчанию напрямую, но можно сделать через or:
local function connect(host, port, timeout)
port = port or 80 -- если не передан — 80
timeout = timeout or 5000 -- если не передан — 5000мс
print("Подключение к " .. host .. ":" .. port)
print("Таймаут: " .. timeout .. "мс")
end
connect("example.com") -- порт=80, таймаут=5000
connect("example.com", 443) -- порт=443, таймаут=5000
connect("example.com", 443, 10000) -- порт=443, таймаут=10000
Функции как значения
В Lua функции — это полноценные значения. Их можно передавать как параметры:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
local function applyToSlots(action)
for slot = 1, 16 do
if turtle.getItemCount(slot) > 0 then
turtle.select(slot)
action(slot)
end
end
end
-- Передаём разные действия
applyToSlots(function(slot)
print("Слот " .. slot .. ": " .. turtle.getItemDetail(slot).name)
end)
applyToSlots(function(slot)
turtle.drop() -- выбросить всё из этого слота
end)
🚀 Задания
Задание 1
Напиши функцию repeat(action, times), которая принимает функцию action и число times, и вызывает action указанное количество раз. Используй её: repeat(turtle.forward, 10).
Задание 2
Напиши функцию fuelStatus(), которая возвращает три значения: уровень топлива, максимум и процент заполненности. Выведи все три.
Задание 3
Напиши функцию findItem(name), которая проходит по слотам 1–16 и возвращает номер слота с предметом с именем name, или nil если не нашла.
Задание 4
Напиши функцию buildWall(width, height). Она принимает размеры стены и строит её из блоков в первом слоте. Используй вложенные циклы for. Протестируй с разными размерами.
Задание 5
Перепиши функцию digTunnel из прошлых заданий: добавь параметр onProgress — функцию, которая вызывается после каждого прокопанного блока с текущим номером блока. Это позволяет вызывающему коду следить за прогрессом.