Size: a a a

2019 June 28

VZ

Vadim Zborovskii in Lua in Moscow
немного не понял
источник

AG

Alexander Gladysh in Lua in Moscow
чтобы таблица могла полностью контролировать свое поведение через метаметоды
источник

AG

Alexander Gladysh in Lua in Moscow
(сорри, у меня сегодня утром совсем плохо с формулировками)
источник

VZ

Vadim Zborovskii in Lua in Moscow
точнее, не всегда успевают за этим следить, потому что в 5.3 сделано много в этом направлении

другое дело, это несколько входит в конфликт с целью "простота и минимализм". с существующими метаметодами уже можно дичайше извращаться
источник

OA

Oleg Andriyanov in Lua in Moscow
Vadim Zborovskii
local tbl = setmetatable({}, {
     __index = function(t, k)
        return 0
     end,
     __len = function(t)
        return 10
     end,
})

print('loop to length...')
for k = 1, #tbl do
  print(k, tbl[k])
end

print('ipairs loop ')
for k, v in ipairs(tbl) do
  -- endless loop here ....
  print(k, v)
end
А разве это не логично? __index не возвращает nil ни по какому ключу, значит, контейнер бесконечный, и цикл тоже
источник

VZ

Vadim Zborovskii in Lua in Moscow
контейнер имеет явно заданную длину. первый цикл в примере не бесконечный.
источник

VZ

Vadim Zborovskii in Lua in Moscow
казалось бы, можно явно учесть __len в итераторе ipairsaux
источник

AG

Alexander Gladysh in Lua in Moscow
говорит ли что-то про длину определение ipairs?
источник

AG

Alexander Gladysh in Lua in Moscow
емнипс, оно говорит "до первой дырки"
источник

AG

Alexander Gladysh in Lua in Moscow
то есть семантика другая (еще один повод для запрета)
источник

VZ

Vadim Zborovskii in Lua in Moscow
вообщем, если следовать букве мануала 5.3, то таблица бесконечная (нет ни одной border)
источник

VZ

Vadim Zborovskii in Lua in Moscow
п. 3.4.7
источник

VZ

Vadim Zborovskii in Lua in Moscow
Alexander Gladysh
емнипс, оно говорит "до первой дырки"
да, действительно
источник

VZ

Vadim Zborovskii in Lua in Moscow
"up to the first nil value". Тогда это не бага, а "зачем так делать было".
источник

AG

Alexander Gladysh in Lua in Moscow
+1
источник

VZ

Vadim Zborovskii in Lua in Moscow
т.е. неявно(!) предполагается инвариант , что длина таблицы -- это по ее первый nil. что нарушается, если мы зададим метаметод __len. Вот засада-то.
источник

AG

Alexander Gladysh in Lua in Moscow
нет
источник

AG

Alexander Gladysh in Lua in Moscow
неявно предполагается, что ipairs — это не численный for
источник

VZ

Vadim Zborovskii in Lua in Moscow
да, не длина, а число итераций.
источник

AG

Alexander Gladysh in Lua in Moscow
похоже на утку, а на самом деле — утконос
источник