Почему мы можем сделать str:split(«,»), но не tab:insert(val)?

#string #methods #lua #lua-table

#строка #методы #lua #lua-таблица

Вопрос:

Мы можем сделать или string.split("1,2,3",",") то, или ("1,2,3"):split(",") другое и получить тот же результат.

Однако tab = {} table.insert(tab, "hi") работает, пока tab = {} tab:insert("hi") выдает ошибку

tab = {} вкладка:вставка («привет»):1: попытка вызвать нулевое значение

Это кажется непоследовательным, я делаю что-то не так или есть веская причина, по которой вызов методов в Lua отличается?

Спасибо,

Ответ №1:

Это потому, что строки имеют метатаблицу по умолчанию в Lua, а таблицы — нет. Вы можете установить метатаблицу самостоятельно:

 local tab = setmetatable({}, {__index = table})
tab:insert("hi")
print(#tab)
 

Это должно вывести 1. Подробности см. в разделах 2.4 и 6.4 руководства по Lua.

Комментарии:

1. Вау, большое вам спасибо!!! В качестве продолжения, возможно ли установить это как глобальное поведение для всех таблиц?

2. Я не думаю, что это возможно с таблицами (по крайней мере, без настройки источника), но, возможно, другие тоже могут прокомментировать это.

3. Я немного поэкспериментировал и прочитал документацию. Не будучи уверенным в изменении метаданных базовой таблицы, я смог просто создать новый объект базовой таблицы, к которому я могу добавить дополнительное поведение и работать в качестве своей базы. Спасибо!