4

C++ アプリのデータ記述言語として Lua を使用しています。SLB 2.0 を使用して Lua にバインドされた多数の C++ クラスがあります。「SetPos」や「SetName」などのメソッドがバインドされています。'pos' または 'name' としてキー付けされた値を持つテーブルを使用して、位置または名前 (たとえば) を指定します。キーを取得し、「set」を先頭に追加し、メソッドが存在する場合はメソッドを呼び出すことができるようにしたい (存在しない場合があります)。それは可能ですか?もしそうなら、何か提案はありますか?

バインドされたメソッドを小文字にすることができることはわかっていますが、バインドされているメソッドと同じままにしておくことをお勧めします (これは私のフォールバックかもしれません)。命名基準に基づいてメソッド名を作成することもできますが、大文字と小文字を区別しない方がエラーが発生しにくくなります。

メタテーブルを使用してこれを解決できるLuaのトリッキーな部分があるはずだと思いますが、自分で解決することはできませんでした.

助言がありますか?

ありがとう!

4

1 に答える 1

5

大文字と小文字を区別しないことは、実際には 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

{} でテーブルを作成する代わりに、この関数呼び出しでテーブルを作成します。それ以外の場合、テーブルは通常どおり機能するはずです (ただし、メンバーへのアクセスは明らかに少し遅くなります)。

于 2012-02-01T20:58:34.960 に答える