Lua のハイブリッド配列とハッシュ テーブル。他に存在しますか?
-
22-09-2019 - |
質問
Lua のテーブルの実装では、その要素が 2 つの部分に分かれています。配列部分とハッシュ部分です。
このようなことは他の言語にも存在しますか?
のセクション 4「表」を参照してください。 Lua 5.0の実装.
解決
このアイデアは、ロベルト・イエルサリムズチーとLuaのチームの残りの部分と元でした。私はロベルトは2003年にMIT軽量言語ワークショップでそれについての講演を聞いて、この話では、彼の前の仕事を議論し、アイデアが新しかったことを説得力のある主張しました。他の言語であるため、それをコピーした場合、私は知りません。
は、元のAwkのは、Luaのよりもいくらか制限された言語モデルを持っています。数値や文字列は、アレイ内のキーとして使用することができるが、アレイ自体はファーストクラスの値ではないいずれか:配列は名前を持つ必要があり、アレイは、アレイ内の鍵として使用することができない
。 ルアのハイブリッドアレイ/テーブル構造ではなく、ブライアン・カーニハンによって維持、及びAwkの実装は、ハッシュテーブルを使用するように、は実装に関して、私は、元のAwkのためのソースをチェックしています。 Luaのテーブルを連続整数キーで使用される場合、空間オーバーヘッドC配列と同じであるため、区別が重要です。これは、のないの元Awkのための真ます。
私はAWKのすべての後に実装を調査するために困っていません、例えば、ヌーAwkの、のmawk、というように。
他のヒント
編集: これは実装に関する質問には答えていません。
AWK もやりました。
一部の言語で、他の言語では異なる操作がどのように混同されているかは興味深いです。
- リストのインデックス作成 -
a[10]
- 連想インデックス作成 -
a['foo']
- オブジェクトフィールドへのアクセス -
a.foo
- 関数/メソッド呼び出し -
a('foo')
/a.foo()
非常に不完全な例:
Perl は、順次インデックスと連想インデックスが別個の構文を持つ珍しい言語です。
a[10]
/a{'foo'}
. 。私の知る限り、オブジェクトフィールドは、クラスの実装者がどの操作を使用したいと思ったかに応じて、他の操作のいずれかにマップされます。Python では、4 つはすべて別個のものです。順次インデックス/連想インデックスは同じ構文を使用しますが、別々のデータ型が最適化されます。
Ruby では、オブジェクトフィールドは引数のないメソッドです。
a.foo
.JavaScript のオブジェクトフィールド
a.foo
連想インデックスのための糖衣構文ですa['foo']
.Lua と AWK では、連想配列は順次インデックス付けにも使用されます。
a[10]
.で アーク, 、順次インデックスと連想インデックスは関数呼び出しのように見えます -
(a 10)
/(a "foo")
, 、 で思うんですけどa.foo
これも構文シュガーです(?)。
私は考えることができる最も近いものはJavascriptです - あなたはnew Array()
を持つ配列を作成し、番号または文字列値のいずれかによってインデックスに進みます。それも、いくつかのJavascriptの実装は、あなたがにリンクされているLuaのドキュメントに記載の理由のために、二つの配列を使用して、そうすることを選択したパフォーマンス上の理由から可能性があります。
ArrayWithHash のC ++の配列、ハッシュテーブルハイブリッドの高速な実装である。
C ++のではキーが(文字列またはポインタキーを挿入する方法)ArrayWithHashで許可されていない唯一の整数、静的に型付けされた言語です。言い換えれば、それは大規模なインデックスのハッシュ・テーブル・バックアップを持つ配列のようなものです。また、それはLuaのテーブルの実装より少ないメモリ効率で異なるハッシュテーブルの実装を使用します。