2012-02-01 5 views
4

私はC++アプリケーションのデータ記述言語としてLuaを使用しています。 SLB 2.0を使ってLuaにバインドされたC++クラスがたくさんあります。私は 'SetPos'や 'SetName'のようなバインドされたメソッドを持っています。私は 'pos'または 'name'とキーを付けた値を持つテーブルを使って、位置や名前を指定します。私は、キーを取ることができるようにしたい、 'セット'の前に、メソッドが存在する場合はそれを呼び出す(そうでないかもしれない)。それは可能ですか?もしそうなら、どんな提案?Luaは大文字と小文字を区別しないメソッド呼び出しをサポートできますか?

私はバインドされたメソッドを小文字にすることができますが、バインドされているメソッドと同じままにしておくことができます(これは私のフォールバックかもしれません)。私は私の命名基準に基づいてメソッド名を構築しようとする可能性がありますが、大文字と小文字の区別がありませんエラーが発生しやすいです。

私はそこにいると感じていますは、メタデータを使ってこれを解決することができるトリッキーな部分ですが、私はそれを自分で解決することができませんでした。

提案がありますか?

ありがとうございます!

+0

私はSLBに精通していません。何らかの形であなたのC++にバインドされた関数でいっぱいのテーブルがありますか? '' __index'というメタメソッドを定義して、テーブルの大文字と小文字を区別しない検索を行い、一致するメソッドを探し出して返すことができるので、関数がいっぱいのテーブルを持っていれば、望むことを実行することは可能です。それで、あなたはなぜこれも必要なのですか? Lua関数は一般に大文字小文字を区別しますので、関数をそのままにしておくことは問題ありません。 –

+2

私は*両方の場所で名前がまったく同じ(+/- 'set'プレフィックス)という一貫性のポリシーを採用し、遵守することを強くお勧めします。 –

+0

私がケースで少し弛緩したいのは、私がこのケースでエラーを起こすと、私は実行時間が分からないということです。明らかにショーストッパーではないが、それはいいだろう。 私が最初にやってみたい理由は、私のルアファイル(例えば定義の配列)に変数(name = "blah")を入れて、メソッドへの呼び出し(myObj.SetName( "blah"))。 –

答えて

6

大文字小文字の区別が本当にルアが扱うものではありません。すべてのテーブル参照とローカル変数アクセスは、最終的に大文字と小文字を区別する文字列の比較です。

最高の解決策は、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関数を変更しないでください。 –

関連する問題