Как добавить метод к типу таблицы?

Как добавить метод к типу таблицы? Я пытаюсь написать метод, который просматривает значения таблицы. Пока что у меня есть.

function table:contains(value)
  for _, v in ipairs(self) do
    if v == value then return true end
  end
  return false
end

И все же, когда я пытаюсь сделать следующее.

t = {'four', 'five', 'six'}
t:contains('five')

Я получаю ошибку.

stdin:1: attempt to call method 'contains' (a nil value)

Какие-либо предложения?

 bluenote1011 окт. 2015 г., 10:33
Обратите внимание, чтоtable.contains(t, 'five') работает. Таким образом, вопрос сводится к: в чем разница междуinstance:method(...) а такжеtype.method(instance, ...), что также озадачивало меняhere.

Ответы на вопрос(3)

t простая таблица, она содержит только следующие пары ключ-значение:[1]='four', [2]='five', [3]='six'.

Если вы хотите "продлить"t чтобы иметь возможность доступа к функциям изtable модуль, вы должны установить метатаблицу с__index указывая наtable модуль. Я легко использую следующую функцию:

function T(t)
    return setmetatable(t, {__index = table})
end

Затем вы можете использовать его следующим образом (благодаря синтаксису Sugar нет необходимости в скобках):

t = T{'four', 'five', 'six'}
t:insert('seven')
print(t:contains('seven')) --> true
Решение Вопроса

tables, В отличие от строк и чисел, каждая таблица имеет свою индивидуальную метатабельность.

Просто сделайте бесплатную функцию вместо "члена" функция для таких вещей. Не все должно быть все ООП с: и тому подобное.

 28 мая 2012 г., 05:43
@lhf: Достаточно справедливо.
 28 мая 2012 г., 05:40
Здесь нетdefault metatable для таблиц.

table библиотека, но вы не дали метатализируемой таблицеt, Там нет автоматической связи междуtable а такжеt.

Ваш ответ на вопрос