Перейти к содержимому
  • 0
Teen_Romance

Работа условного оператора if

Вопрос

Хотел сделать так, чтобы если ячейка сундука пустая, то проверка не выполнялась, но все равно ругается почему то программа :(

image.png.ddd7a8ff55efa9f90b2bfb4c12ab7490.png

Типа если y(nil) тогда не выполнять следующий иф.

image.png.852e6808def0e90712a684863151c16c.png

Как пофиксить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

@Teen_Romance, замищательно! Держи тяночку. Она тоже искала идшники в таблицах, но что-то пошло не так...

 

0puzZUDCa7o.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15.03.2019 в 16:02, Teen_Romance сказал:

Минуты 2 сидел вчитывался и не мог понять фишку, а потом каааак понял 🤣 На самом деле гениально, просто звучит сложно. Если элемента по такому ключу в таблице не будет то выражение просто будет равно nil )

Сложно как то еще применить но я подумаю)

Спасибо большое еще раз :)

Вот тебе еще один способ сравнения:

local prefix = "Я знаю, это "
local function unknown()
  print("Об этом я не ничего знаю")
end

local indexer = {
  __index = function(self, key)
    local value = rawget(self, key)
    if value then
      return function() print(prefix .. value) end
    else
      return unknown
    end
  end
}

local knowns = {
  ["minecraft:cobblestone"] = "опять чертова кобла",
  ["minecraft:planks"] = "доски",
  ["minecraft:tnt"] = "кубик веселья",
  ["minecraft:log"] = "бревно, как моя бывшая"
}

setmetatable(knowns, indexer)

local me_controller = require("component").me_controller

for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do
  print(item_stack.label, " = ", item_stack.size)
  knowns[item_stack.name]()
end

 

Для того чтоб посмотреть как оно работает, надо подключиться к контроллеру МЭ-сети адаптером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это точно рабочий код? Есть у меня сомнение, хотелось бы развеять.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
7 минут назад, Zer0Galaxy сказал:

Это точно рабочий код? Есть у меня сомнение, хотелось бы развеять.

Я не тестировал. Каковы сомнения?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, man_cubus сказал:

Я не тестировал. Каковы сомнения?

Сомнение в том, что __index вызывается только при отсутствии элемента в таблице.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
6 минут назад, eu_tomat сказал:

Сомнение в том, что __index вызывается только при отсутствии элемента в таблице.

Неправда

t = {1,2,3,4}
mt = {__index=function(self, key) v=rawget(self,key) if v then return v else return "shit!" end end }
setmetatable(t,mt)

for i=1,6 do print(t[i]) end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 минуты назад, eu_tomat сказал:

@man_cubus И что доказывает этот код?

Действительно, тут нужна прокси таблица. Вот исправленная версия

 

local prefix = "Я знаю, это "
local function unknown()
  print("Об этом я не ничего знаю")
end

local descriptions = {
  ["minecraft:cobblestone"] = "опять чертова кобла",
  ["minecraft:planks"] = "доски",
  ["minecraft:tnt"] = "кубик веселья",
  ["minecraft:log"] = "бревно, как моя бывшая"
}

local indexer = {
  __index = function(self, key)
    local value = descriptions[key]
    if value then
      return function() print(prefix .. value) end
    else
      return unknown
    end
  end
}

local knowns = {}

setmetatable(knowns, indexer)

local me_controller = require("component").me_controller

for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do
  print(item_stack.label, " = ", item_stack.size)
  knowns[item_stack.name]()
end

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Похоже, ты не уловил сути метатаблиц. Нет, теперь то код рабочий. Но какой смысл в метатаблице если сама таблица knowns не содержит элементов? Просто вызывай функцию __index и всё.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вот я о чем:

local knowns = {"A","B","C"}
local indexer = {
  __index = function(self, key)
      return "unknown"
    end
}

setmetatable(knowns, indexer)

for i=1,5 do
	print(knowns[i])
end

результат:

A
B
C
unknown
unknown

т..е. __index стреляет только для тех элементов, которые отсутствуют в таблице knowns.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Zer0Galaxy сказал:

теперь то код рабочий. Но какой смысл в метатаблице если сама таблица knowns не содержит элементов? Просто вызывай функцию __index и всё.

Если задаваться вопросами о смысле, то какой смысл и в функции __index, если наличие элемента в таблице легко проверяется обычным обращением к самому элементу?

Чем это удобнее уже обсуждённой конструкции if tbl[idx] then?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это удобней уже тем, что обращений к элементу таблиц в программе может быть множество. И при каждом обращении нужно ставить проверку, "а существует ли такой элемент?". В случае с метатаблицей такую проверку берет на себя Луа. Конечно это никак не ускоряет выполнение программы (наверное), но количество кода сокращает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
16 минут назад, Zer0Galaxy сказал:

Это удобней уже тем, что обращений к элементу таблиц в программе может быть множество. И при каждом обращении нужно ставить проверку, "а существует ли такой элемент?". В случае с метатаблицей такую проверку берет на себя Луа. Конечно это никак не ускоряет выполнение программы (наверное), но количество кода сокращает.

Да, в определённых случаях метатаблицы, конечно, помогают сократить код. Это понятно. Вопрос в том, как это поможет упросить наш случай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
17 минут назад, Zer0Galaxy сказал:

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

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

knowns[item_stack.name]()

и для тех предметов, которые мы определили, мы можем обрабатывать их или единообразно, выводя про них комментарий или неоднородно, в зависимости от типа.

В итоге вместо 10  elseif будет 2-3 функции-обработчика, организованных в одну таблицу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А кто говорил про 10 elseif? :blink: 

Если по простому, то нужно просто принтить содержимое элемента таблицы, а для отсутствующих элементов выводить "Об этом я не ничего знаю"

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Угу, оберточная функция только занимает память, а к ней еще приколхожен объект, который моментально создается и исчезает.

Нужны либо мухи, либо котлеты. А это ниндзя-индусский код.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Только что, Doob сказал:

Угу, оберточная функция только занимает память, а к ней еще приколхожен объект, который моментально создается и исчезает.

Нужны либо мухи, либо котлеты. А это ниндзя-индусский код. 

Да, но для однопоточной ОС без параллелизма может прокатить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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