Вопрос для начинающих по LuaPlus Metatables - PullRequest
2 голосов
/ 30 августа 2011

Я новичок в Lua / LuaPlus и пытаюсь понять, как работают метатаблицы.

В этом коде взято из руководства:

LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable");
metaTableObj.SetObject("__index", metaTableObj);
metaTableObj.RegisterObjectFunctor("Print", &MultiObject::Print);

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

А затем в следующем разделе кода:

MultiObject obj1(10);
LuaObject obj1Obj = state->BoxPointer(&obj1);
obj1Obj.SetMetaTable(metaTableObj);
state->GetGlobals().SetObject("obj1", obj1Obj);

Мы создаемОбъект C ++, свяжите его адрес с LuaObject через вызов BoxPointer и установите метатаблицу, чтобы мы могли использовать функцию Print.

Но для последней строки это просто создание глобальной переменной Lua с именем "obj1".«?На этом этапе «obj1» и «MultiObjectMetaTable» будут глобальными переменными Lua?

1 Ответ

2 голосов
/ 30 августа 2011

Это не стандартная Lua, похоже, вы используете какую-то оболочку C ++, с которой я не знаком, но я могу сделать некоторые предположения

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

__index - это специальный ключ при использовании метатаблиц. Если у меня есть таблица t, и я пытаюсь проиндексировать ее, например, ключом foo, естественно, я вернусь к значению, связанному с этим ключом. Но допустим, там ничего нет. Обычно, если вы попытаетесь проиндексировать место, где нет ничего, вы получите nil назад.

Но нет, если у вас есть метатабель со специальным ключом __index! Если у вас есть метатабель с функцией или таблицей __index, он будет использовать ее для определения вашего значения. Если у вас есть таблица, назначенная для __index, как здесь, она будет просматривать эту таблицу и возвращать значение по указанному вами ключу. Это позволяет вам получить поведение, подобное наследованию. то есть, если таблица t не имеет этого значения, по умолчанию используется значение в этой другой таблице.

But for the last line, is that just creating a global Lua variable called "obj1"? At this point "obj1" and "MultiObjectMetaTable" will be global Lua variables?

Как я уже говорил, это не стандартный Lua, поэтому я не совсем уверен, что там происходит. (Смешение C ++ и Lua может оказаться сложным, поэтому, хотя вы все еще изучаете Lua, вероятно, лучше придерживаться интерфейса C, чтобы вы могли понять, что происходит на самом деле. Как только вы поймете, что можете перейти к более автоматизированным решениям)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...