Реализация Lua таблиц сохраняет свои элементы в двух частях: часть массива и часть хеша.
Такая вещь существует на каких-либо других языках?
Смотрите на раздел 4, Таблицы, в Реализации Lua 5.0.
Эта идея была оригинальной с Roberto Ierusalimschy и остальной командой LUA. Я слышал, как Roberto расскажет об этом на семинаре MIT легких языков в 2003 году, и в этом разговоре он обсуждал предварительную работу и убедительно утверждал, что идея была новой. Я не знаю, копировали ли другие языки, с тех пор.
Оригинал awk имеет несколько более ограниченную модель языка, чем lua; Либо номер, либо строка, можно использовать в качестве ключа в массиве, но сами массивы не являются первоклассными значениями: массив должен иметь имя, и массив не может использоваться в качестве ключа в массиве.
Что касается реализации, я проверил источники для оригинального awk, поддерживаемых Брайем Кернеганом, и реализация AWK использует хеш-таблица, а не гибридный массив LUA. Различие важно, потому что в LUA, когда таблица используется с последовательными целочисленными клавишами, накладные расходы пространства такие же, как для массива C. Это не true для оригинального awk.
Я не удосужился расследовать все более поздние реализации AWK, E.g. GNU awk, Mawk и так далее.
Самое близкое, что я могу придумать, это Javascript - вы создаете массив с помощью new Array()
, а затем переходите к индексированию либо по номеру, либо по строковому значению. Вполне возможно, что по причинам производительности некоторые реализации Javascript предпочитают делать это с использованием двух массивов, по причинам, указанным в документации Lua, на которую вы ссылаетесь.
EDIT: Это не отвечает на вопрос, который касался реализации.
AWK также сделал это.
Это целое число, как одни языки соединяют операции, которые отличаются в других:
a[10]
a['foo']
a. foo
a('foo')
/ a.foo()
Очень неполные примеры:
Perl - редкий язык, где последовательное/ассоциативное индексирование имеет отдельный синтаксис - a[10]
/ a{'foo'}
. AFAIK, сопоставление полей объектов с одной из других операций, в зависимости от того, какую операцию захотел использовать исполнитель класса.
На Python все 4 разные; последовательная/ассоциативная индексация использует один и тот же синтаксис, но для них оптимизированы отдельные типы данных.
В Ruby поля объектов - это методы без аргументов - a.foo
.
В JavaScript поля объектов a.foo
являются синтаксическим сахаром для ассоциативной индексации a['foo']
.
В Lua и AWK ассоциативные массивы также используются для последовательного индексирования - a[10]
.
В Arc последовательная и ассоциативная индексация выглядит как вызов функции - (a 10)
/ (a "foo")
, и я думаю, что a.foo
для этого тоже является синтаксическим сахаром(?).