Перейти к контенту
Malandrinus

Язык Lua. Общие вопросы программирования

Рекомендуемые сообщения

С чего начинать и где взять.

 

Установка Lua:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=629106

 

Руководство «Программирование на языке Lua», третье издание:
http://www.amk-team.ru/forum/index.php?showtopic=11584&p=905308

Изменено пользователем Kirgudu
Ссылка на комментарий
Позволю и себе высказать мнение о проверке на nil в примере Kober(BRUC).

Считаю что такая проверка абсолютно бесполезна.

Ну хорошо. db.actor не nil. Остается 7 типов значений (перечислять не буду)

Как это поможет, если db.actor окажется, например, числом? К этому числу будет применен метод position, ну или какой другой. Результат всё равно не изменить. Крах.

 

Тут просто, видимо, разработчики предполагали что при наявности actor-a в таблице db обязательно будет создано поле actor, и его значением обязательно будут данные actor-а.

Значит достаточно проверить:

есть данные этого поля - есть actor

нет данных - нет actor

 

Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ...

Именно это и требуется - проверка на то, что там есть реальные(не nil, а прицепом и не false) данные.

 

Другое дело, когда очень хочется сравнить с чем-то, то вместо сравнения с nil, гораздо полезнее поставить сравнение с типом "userdata". Так вариантов для прокола станет намного меньше.

Изменено пользователем Nazgool
  • Нравится 1
Ссылка на комментарий

Вот вот, именно это я и имел ввиду, только не умею так развернуто излагать свои мысли.


 

 

в каких случаях нужна проверка на nil

 

Ну, тебе уже показали пример. Я добавлю. Часто я проверку на nil, или подобное значение в других языках, использую, как третье логическое значение. Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ. Вот nil - это и есть это самое НЕ ЗНАЮ.

 

Ну например. Есть у меня функция, которая возвращает, является-ли данный непись врагом. К примеру. Она возвращает true, что означает безусловно враг; false, что означает безусловно не враг; и nil, что означает не знаю, проверяй другими методами.

Ссылка на комментарий

Говорим про nil, а Desertir напомнил про неэквивалентность. Вот я и вспомнил, хотя уже когда-то писал:

Запись :

function x()
    return
end

не эквивалентна :

function y()
    return nil
end

Вроде бы и одинаковы :

print(x()==nil) --> true
print(y()==nil) --> true

Но :

print(select('#', x())) --> 0
print(select('#', y())) --> 1

в первом случае void, во втором nil - как совершенно определенный тип значения

Изменено пользователем Nazgool
  • Нравится 1
  • Полезно 2
Ссылка на комментарий

Поэтому руководствуясь "пишем в коде то, чего требуем", для этого случая достаточно проверки if db.actor then ...

До этого я сразу высказался, что в том случае это не принципиально, я вообще за демократию.

Возможно было бы лучше вообще написать функцию типа isActor, но вспоминая всякие isWeapon и прочая... Короче, языки с динамической типизацией, они такие.

в первом случае void, во втором nil - как совершенно определенный тип значения

А вот тут хочу подискутировать. Строго говоря, в обоих случаях используется массив значений, только в первом случае он пустой, а во втором есть один элемент - nil.

К этим ребятам можно добавить еще вот это:

function z()
  -- здесь return'а нет
end
Ну а так как имеем дело с Lua, где значение *ПУСТО* описывается только одним nil'ом, то и получаем, что x()==nil; y()==nil; z()==nil.

 

Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ

Опять же мой *любимый* JavaScript, этот экземпляр подвида скриптовых умеет переваривать значения null и undefined. В нем функции x() и y() отличаются.

null типа "в этой переменной когда то будет значение, наверное"

а undefined "я в душе не гребу, что это за переменная, и откуда она взялась"

:D

Изменено пользователем Desertir
  • Нравится 1

ТЧ 1.0004. SAP и Trans mod

github

Ссылка на комментарий

 

 

Т.е. я использую ДА, НЕТ и НЕ ЗНАЮ. Вот nil - это и есть это самое НЕ ЗНАЮ.

Напомнило комичный случай из личной практики :) когда начинал писать "скриптовый интерфейс" - он был только инвентарем, и ничем больше. Потом туда же добавилось окно обыска - потребовалось указать при создании интерфейса, что же рисовать. Добавил к входным аргументам еще один. Если он ~= nil - рисуем окно обыска.

Потом туда же добавилось ПДА. Потребовалось выяснять еще значение этого аргумента.

В итоге интерфейс рисуется по принципу:

Нарисовать окно обыска?

 -> Если да (true), рисуем окно обыска

 -> Если нет (false), рисуем пда

 -> Если не известно (nil), рисуем инвентарь.

Выглядит забавно, переписать более нормально руки не доходят, так и работает :)

 

 

 

а undefined "я в душе не гребу, что это за переменная, и откуда она взялась"

И почему я не пишу на JavaScript, он мне уже заочно нравится :)

Мод, где не бывает одинаковых путей - Судьба Зоны. (Лучшее, что у меня получилось на X-Ray) На базе модифицированного движка OGSR Engine.

Бывший мододел на X-Ray / Начинающий игродел на Unreal Engine. Программист.

AMD Ryzen 9 7950X (16 ядер, 5.7ГГц); RTX 3080; 128 ГБ DDR5; Arctic Liquid Freezer II-420; 3 ТБ SSD PCIe 4.0; 4ТБ HDD.

Ссылка на комментарий

Добрый день.

Есть у меня допустим такой код:

function grenage ()
alife():create("grenade_f1",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())
alife():create("grenade_rgd5",db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id()) 
end

 И таких функций несколько. Только создается разные предметы. Например место гранат аптечки и бинты. Здесь как я понимаю переменная local не подойдет. Так как функций несколько, а local ставится только перед одной функцией(как я понял). В целом я хочу упростить эти функции. Т.е. вместо "db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())" написать так(в начале скрипта): 

position = db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())

Ну, а потом уже функции в которых заместо "db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())" будет писаться просто position. Вот так:

position = db.actor:position(),db.actor:level_vertex_id(),db.actor:game_vertex_id(),db.actor:id())


function grenage()
alife():create("grenade_f1",position
alife():create("grenade_rgd5",position
end

function med()
alife():create("bandage",position
alife():create("medkit",position
end

 Будет ли все это дело работать. И еще на последок. Если я сделаю отдельный скрипт где будут "тонны" этих сокращений, можно ли тогда их вызывать. Если да, то как?

Ссылка на комментарий

Будет ли все это дело работать

Конечно нет. Одной переменной можно присвоить только одно значение.

В твоём случае можно просто написать функцию для спауна предмета в инвентарь актера, и спаунить все через неё:

function spawn_item_in_inv(section)
  return alife():create(section, vector():set(0, 0, 0), 0, 0, 0)
end
Потом, соответственно:

function med()
  spawn_item_in_inv("bandage")
  spawn_item_in_inv("medkit")
end
P.S.: в функции везде нули, т.к. при спавне в инвентарь координаты значения не имеют. Последний ноль - id актера, он всегда равен 0. Изменено пользователем naxac
  • Спасибо 2

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

 

 

А вот тут хочу подискутировать

Да тут и дискутировать особо не о чем. Только теория.
Практическое использование подобного не встречал, да и на граблей на этой основе тоже.
Это так, из раздела "Занимательная наука" ))

Ссылка на комментарий

Добрый вечер. Потихоньку изучая lua столкнулся с такой проблемой:

при вызове этого(не в сталкере):

number_tbl = {
1,
2,
3,
4,
5,
6,
7,
8,
9}

data = math.random(#number_tbl)

print(data)

Всегда получается число "8". Мне интересно, почему?

Ссылка на комментарий
@Kober(BRUC), не знаю, но я делаю каждый раз на загрузке, "на всякий случай")) Изменено пользователем naxac
  • Нравится 1

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий

Есть "ужасный" код: 

random = true

say_tbl = {
"Текст1",
"Текст2",
"Текст3",
"Текст4",
"Текст5",
"Текст6",
"Текст7",
"Текст8",
"Текст9",
"Текст10"}

data = math.randomseed(os.time())
data = math.random(1,10)

if random and data == 1 then
print(say_tbl[1])
elseif random and data == 2 then
print(say_tbl[2])
elseif random and data == 3 then
print(say_tbl[3])
elseif random and data == 4 then
print(say_tbl[4])
elseif random and data == 5 then
print(say_tbl[5])
elseif random and data == 6 then
print(say_tbl[6])
elseif random and data == 7 then
print(say_tbl[7])
elseif random and data == 8 then
print(say_tbl[8])
elseif random and data == 9 then
print(say_tbl[9])
elseif random and data == 10 then
print(say_tbl[10])
end 

 

 

 

Хотел сделать его попроще и изменил вот на это:

random = true

say_tbl = {
"Текст1",
"Текст2",
"Текст3",
"Текст4",
"Текст5",
"Текст6",
"Текст7",
"Текст8",
"Текст9",
"Текст10"}

data = math.randomseed(os.time())
data = math.random(#say_tbl)

if random == true 
or random == nil then
print(data)
end 

 

 

 

Но вот беда. Вместо текста появляются числа от одного до десяти. Как это дело исправить? 

Ссылка на комментарий
print(say_tbl[data])

И ещё, math.randomseed ничего не возвращает, поэтому записывать в переменную data нечего.

Изменено пользователем Nazgool
  • Спасибо 1
Ссылка на комментарий

Добрый день.

Есть такой код: 

language = eng -- ru or eng
random_shpare = true -- Шар вкл/выкл

say_tbl_ru = {  -- Таблица с русскими ответами
"да",
"нет",
"возможно",
"не знаю"}

say_tbl_eng = { -- Таблица с английскими ответами
"Yes",
"No",
"Possible",
"Don't know"}

function random_shpare_language() 
if language == ru then -- Если глобальная переменная language равна ru
sphare_ru() -- То вызываем эту функцию
elseif language == eng then -- Если глобальная переменная language равна eng
sphare_eng() -- То вызываем эту
end
end

data_ru = math.randomseed(os.time())
data_ru = math.random(#say_tbl_ru)

data_eng = math.randomseed(os.time())
data_eng = math.random(#say_tbl_eng)

function sphare_ru() 
if random_shpare == true -- Если Шар включен(true)
or random_shpare == nil then -- Или равен любому другому значению кроме false
print(say_tbl_ru[data_ru]) -- То выводим данный текст
end 
end

function sphare_eng() 
if random_shpare == true -- Если Шар включен(true)
or random_shpare == nil then -- Или равен любому другому значению кроме false
print(say_tbl_eng[data_eng]) -- То выводим данный текст
end 
end

random_shpare_language() 

 

 

 

Сам код работает, но вот смена языка нет. Всегда текст появляется на русском.

Ссылка на комментарий

Добрый день. Написал такой код:

 

all_tbl = {

q,

w,

e,

r,

t,

y,

u,

i,

o,

p,

a,

s,

d,

f,

g,

h,

j,

k,

l,

z,

x,

c,

v,

b,

n,

m,

1,

2,

3,

4,

5,

6,

7,

8,

9,

0}

 

local on = true

 

function zoz()

if on then

oz()

end

end

 

function oz()

for fg = 1, 15 do

math.randomseed(os.time())

random = math.random(#all_tbl)

print(all_tbl[random])

end

end

 

zoz()

 

Но значения берутся не из таблицы, а равны nil. В чем же проблема?

Ссылка на комментарий

@Kober(BRUC), потому что сейчас это не массив, а не пойми что.

Каждый буквенный элемент следует заключить в кавычки.

  • Спасибо 1
Ссылка на комментарий

Приветствую.

Меня интересует - куда Луа определяет переменную, которую инициализируют, например, так:

function mmm()
  var = 123
end
И раньше она нигде не была объявлена.

Где ее можно найти? В _G?

Аддон для ОП-2.09.2: Яндекс/Google/GitHub

naxac.gif

Ссылка на комментарий
@naxac, подозреваю, в глобальном пространстве имен оно будет, т.е. в G. Хорошая, кстати, грабля. Ошибиться достаточно легко, а причину глюков потом искать у-у-у...
  • Согласен 1
Ссылка на комментарий

Создайте аккаунт или авторизуйтесь, чтобы оставить комментарий

Комментарии могут оставлять только зарегистрированные пользователи

Создать аккаунт

Зарегистрировать новый аккаунт в нашем сообществе. Это несложно!

Зарегистрировать новый аккаунт

Войти

Есть аккаунт? Войти.

Войти
  • Недавно просматривали   0 пользователей

    Ни один зарегистрированный пользователь не просматривает эту страницу.

AMK-Team.ru

×
×
  • Создать...