2012-02-01 2 views
4

Я использую Lua в качестве языка описания данных для своего приложения на C++. У меня есть куча классов C++, связанных с Lua, используя SLB 2.0. У меня есть методы, такие как «SetPos» или «SetName». Я указываю позицию или имя (например), используя таблицу со значениями, указанными как «pos» или «name». Я хочу иметь возможность взять ключ, добавить «набор» и вызвать метод, если он существует (он может и не быть). Это возможно? Если да, то какие-нибудь предложения?Может ли Lua поддерживать нечувствительный к регистру метод?

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

Я чувствую, что должен быть быть сложным куском Lua, который мог бы решить это с помощью metatables, но я не смог самостоятельно его обработать.

Любые предложения?

Спасибо!

+0

Я не знаком с SLB. У вас есть таблица, полная функций, которые каким-то образом связаны с вашим C++? Конечно, вы можете делать то, что хотите, если у вас есть таблица, полная функций, потому что вы можете определить метатежный метод '__index', чтобы сделать поиск в регистровом формате таблицы для соответствующего метода и вернуть его. Тем не менее, зачем вам это нужно? Функции Lua в целом чувствительны к регистру, поэтому я не вижу проблем с оставлением ваших функций как есть. –

+2

Я бы * решительно * предложил принять и придерживаться политики согласованности, когда имена одинаковы (+/- префикс 'set') в обоих местах. –

+0

Причина, по которой я хочу быть немного слабеющей, состоит в том, что если я сделаю ошибку в случае, я не буду знать, пока время исполнения. Очевидно, это не шоу-стоппер, но было бы неплохо. Что касается того, почему я хотел бы сделать это в первую очередь, я хочу взять переменную (name = "blah") в свой lua-файл (например, в массив определений) и сопоставить его с вызов метода (myObj.SetName («бла»)). –

ответ

6

Нечувствительность к регистру - это не то, что Lua обрабатывает. Все таблицы поиска и локальные переменные обращения в конечном счете, строка, чувствительная к регистру, сравнивается.

Лучшим решением было бы просто признать, что вы имеете дело с чувствительной к регистру системой, как и на C++, и справляетесь с ней.

Однако, если вы действительно этого хотите, вы можете это сделать. Самый простой способ - поставить все возможные перестановки имени в вашей таблице функций. Так что ваша табличная функция будет иметь следующее:

["setname"] = theFunction, 
["Setname"] = theFunction, 
["sEtname"] = theFunction, 
["SEtname"] = theFunction, 
... 

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

Более сложным, но более простым в использовании механизмом было бы использовать метаметоды __index и __newindex вместе с пустым трюком стола.

function CreateCaseInsensitiveTable() 
    local metatbl = {} 

    function metatbl.__index(table, key) 
    if(type(key) == "string") then 
     key = key:lower() 
    end 

    return rawget(table, key) 
    end 

    function metatbl.__newindex(table, key, value) 
    if(type(key) == "string") then 
     key = key:lower() 
    end 

    rawset(table, key, value) 
    end 

    local ret = {} 
    setmetatable(ret, metatbl) 
    return ret 
end 

Вместо создания таблицы с {} вы создаете таблицу с помощью этого вызова функции. В противном случае таблица должна работать как обычно (хотя, очевидно, доступ к элементам будет немного медленнее).

+0

Спасибо. Я решил изменить SLB, чтобы создать псевдоним нижнего регистра для моей привязки метода. Затем я могу просмотреть это с помощью __index в своем классе и вызвать его, используя форму «funcName (objectInstance, methodName)». Мне нужна эта функция для сериализации данных, поэтому я не буду изменять теперь функции __index & __newindex. –