C コード内には、配列とその中の検索に使用されるゼロから始まるインデックスがあります。次に例を示します。
char * names[] = {"Apple", "Banana", "Carrot"};
char * name = names[index];
index
埋め込まれた Lua スクリプトから、関数経由でアクセスできgetIndex()
、配列ルックアップを複製したいと考えています。Luaの1ベースの配列を考えると、これを行うための「最良の」方法について合意されたものはありますか?
たとえば、C 配列と同じ内容の Lua 配列を作成することもできますが、インデックスを作成するときに 1 を追加する必要があります。
names = {"Apple", "Banana", "Carrot"}
name = names[getIndex() + 1]
または、より複雑なテーブルを使用して 1 を追加する必要を回避することもできますが、これは次のようなものを壊します#names
。
names = {[0] = "Apple", "Banana", "Carrot"}
name = names[getIndex()]
どのようなアプローチが推奨されますか?
編集:これまでの回答ありがとうございます。残念ながら、getIndex 関数内のインデックスに 1 を追加するソリューションは、常に適用できるとは限りません。これは、インデックスが「よく知られている」場合があるためです。つまり、インデックス 0 は「Apple」などを意味することが文書化されている場合があります。そのような状況では、上記の解決策のいずれかを優先する必要がありますか、それともより良い代替手段がありますか?
編集 2:回答とコメントに感謝します。この問題について考えるのに本当に役立ちました。問題が発生する 2 つの異なるシナリオがあり、理想的な解決策はそれぞれ異なる可能性があることに気付きました。
最初のケースでは、たとえば、時々異なる可能性のある配列と、現在の配列に対して単純に相対的なインデックスを考えてみましょう。インデックスは、コードの外では意味を持ちません。Doug Currie と RBerteig は完全に正しいです。配列は 1 ベースで、.getIndex
を含む必要があり+1
ます。前述したように、これにより、C 側と Lua 側の両方のコードを慣用的にすることができます。
2 番目のケースには、意味を持つインデックスと、おそらく常に同じ配列が含まれます。極端な例は where names
contains"Zero", "One", "Two"
です。この場合、各インデックスの期待値はよく知られているので、Lua 側のインデックスを 1 ベースにするのは直感的ではないように感じます。他のアプローチのいずれかを優先する必要があると思います。