Size: a a a

2020 November 06

S

Snusmumriken in pro.lua
local set = {
 a = true,
 b = true,
 foo = true,
 ["foo"] = true -- то же самое
}

-- это всё - одно и то же
if set.foo then ... end
if set["foo"] then ... end

local lactac = "foo"
-- по значению переменной
if set[lactac] then ... end
источник

F

Fruity in pro.lua
а если мне надо найти, содержится ли b в:
set = {a,b,c,d,e} ?
источник

S

Snusmumriken in pro.lua
for i = 1, #set do
 if b == set[i] then return true end
end
источник

S

Snusmumriken in pro.lua
Потому что set = {a,b,c,d,e} это чистый незамутнённый массив со значениями переменных a, b, c, d и e, а не хеш-мапа.
источник

F

Fruity in pro.lua
Snusmumriken
for i = 1, #set do
 if b == set[i] then return true end
end
что-то тут не работает, я нее понимаю :(
источник

S

Snusmumriken in pro.lua
Это должно быть функцией.
источник

S

Snusmumriken in pro.lua
чот такое
function find_in_array(arr, v, offset)
 for i = offset or 1, #arr do
   if arr[i] == v then return i end
 end
 return nil
end
источник

S

Snusmumriken in pro.lua
Fruity
что-то тут не работает, я нее понимаю :(
Больше экспериментируй.

Допустим, у нас вот такой код:
b = 10
set = {a, b, c, "d", e}

print( set[1] ) --> nil
print( set[2] ) --> 10
print( set[3] ) --> nil
print( set[4] ) --> d
print( set["a"] ) --> nil
print( set.b ) --> nil
Это массив. Тут только числовые ключи.

В полной записи оно выглядело бы как
set = {[1] = a, [2] = b, [3] = c, [4] = "d", [5] = e}
источник

F

Fruity in pro.lua
попробую переварить) после питоновского for item in array, как-то сложно
источник

S

Snusmumriken in pro.lua
В луа есть
for i, item in ipairs(array) do, что есть примерно то же но лучше (ибо встроенный счётчик).
источник

F

Fruity in pro.lua
А if item in list нет?
источник

S

Snusmumriken in pro.lua
Теперь давай вот так:

b = 10
set = {a = 1, b = 2, ["c"] = 3, "d", [b] = 4, "e"}
      ^ хеш  ^ хеш    ^ хеш    ^массив ^ хеш  ^ массив

-- "e" = "bar" -- ошибка синтаксиса, нужно точно определить что "e" это ключ

print( set[1] ) --> "d" -- потому что оно попало в массивную часть
print( set[2] ) --> "e"
print( set.a ) --> 1
print( set.b ) --> 2
print( set.c ) --> 3
print( set['c'] ) --> 3 -- то же самое
print( set[b] ) --> 4 -- [b] это [10]
print( set[10] ) --> 4
источник

S

Snusmumriken in pro.lua
Fruity
А if item in list нет?
Нет.
Есть if set[item] then
источник

S

Snusmumriken in pro.lua
У луа нет списков. Есть массиво-дикты, которые одновременно массивы и одновременно дикты. Используй массив как список, если важен порядок. Или дикт-сет, если порядок не важен но нужна уникальность.
источник

F

Fruity in pro.lua
я еще не могу оценить, что эффективней, использование такой записи lua . org/pil/11.5.html кажется максимально простой и эффективной, когда у меня есть возможность вручную словарь прописать
источник

S

Snusmumriken in pro.lua
Ты про это?
function Set(list)
 local set = {}
 for _, l in ipairs(list) do set[l] = true end
 return set
end
источник

F

Fruity in pro.lua
да, в моем случае я ухожу от этой функции, т.к. словарь прописываю вручную
источник

S

Snusmumriken in pro.lua
Ну дык делай как делается.
Эта функция фактически только проходит по массиву и превращает его в дикт, где значения массива это ключи. Как будто инвертирование ключей и значений.
источник

S

Snusmumriken in pro.lua
Кстати, я бы оформил в виде
function table_invert(src)
 local dst = {}
 for key, value in pairs(src) do
   dst[value] = key
 end
 return dst
end

Типа, оно может превратить
{ foo = 1, bar = 2 }
в
{"foo", "bar"}
и обратно
источник

F

Fruity in pro.lua
Snusmumriken
Так вот, это не список, это хеш-мапа которая используется как сет.
Но у хеш-мапы должны быть и ключ и значение.
вот 10 раз перечитал и тут понял, что в данном контексте у меня и возник вопрос, получается питон с его if item in list, рассматривает лист как словарь и подразумевает, что у каждого ключа значение тру?
источник