Объектно-ориентированная lua sans лежащая в основе ассоциативная механика контейнеров - PullRequest
1 голос
/ 23 ноября 2011

Есть ли синтаксический сахар для использования объектно-ориентированного lua путем использования части массива конструкции таблицы lua?

-- foo_index == number
local foo_index = global_bar_object_prototype.foo; 
bar[foo_index]("hello world"];

--vs.
-- file 2 bar.foo type == function
bar.foo("hello world");

-- both versions call the same function with the same input

Я надеялся, что luajit выполнит интернирование между строками, чтобы оптимизировать / кэшировать доступ к ключу строки, придавая ему характеристики доступа, подобные массиву. Однако мой наивный тест опроверг предположение. Я надеюсь, что моя логика бенчмарка неверна, и в этом случае мне не нужно искать синтаксический сахар.

Каковы идиомы, делающие объектно-ориентированные lua, характеристиками O (1) (поиск функций) для высокопроизводительных сценариев? Я уверен, что программисты игрового интерфейса видели это из первых рук.

1 Ответ

1 голос
/ 17 декабря 2011

Не уверен, что я понимаю вопрос, но если вы спрашиваете, существует ли способ определить гистограмму как объект такой, что

bar[foo_index]("hello")

сработает, да, есть способ: метатабельный элемент bar должен определять __index, чтобы он мог принимать целое число в качестве ключа и возвращать связанный метод. Где-то на панели «конструктор» вы определяете отображение индексов на «методы»; __index посмотрел бы на это отображение и вернул функцию.

Вы, вероятно, также добавили бы метод, который бы брал имя метода и возвращал соответствующий индекс, поэтому вызывающей стороне не нужно знать, что создает конструктор отображения:

foo_index = bar.getMethodIndex('foo')
bar[foo_index]("hello")

Еще одна оптимизация, разрешенная lua, -

foo_meth = bar.foo
foo_meth(bar, "hello")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...