В чем разница между "t1 .__ index = t2" и "setmetatable (t1, {__index = t2})" "? - PullRequest
0 голосов
/ 15 мая 2018

Я видел эти вещи в чужом коде, и если я правильно понял, его следует использовать так:

t1 = {}
t1.__index = t2 --1

function t1:new()
    local new = {}
    setmetatable(new, {__index = t1}) --2

    new.something = 0

    return new
end

Но что они на самом деле делают и почему пишут по-другому?

1 Ответ

0 голосов
/ 15 мая 2018

Они написаны по-разному, потому что они делают разные вещи.

t1 = {}
t2 = {a = 20}
meta = {__index = t2}
setmetatable(t1, meta)
print(t1.a) -- prints 20

Обратите внимание, что здесь есть 3 таблицы: meta, метатабельная, t2, в которой хранятся ключи a и t1 который мы хотим установить для поиска отсутствующих ключей в t2.

Метатабельная функция предназначена только для управления поведением t1, но, чтобы использовать меньше таблиц, люди часто используют резервную таблицу(t2) как метатабельный (meta), так что он становится чем-то вроде

t1 = {}
t2_and_meta = {a = 20}
t2_and_meta.__index = t2_and_meta
setmetatable(t1, t2_and_meta)
print(t1.a) -- prints 20
...