簡體   English   中英

Lua的混合數組和哈希表;它存在於其他地方嗎?

[英]Lua's hybrid array and hash table; does it exist anywhere else?

Lua的表實現將其元素分為兩部分:數組部分和散列部分。

這樣的東西是否存在於任何其他語言中?

看一下Lua 5.0實現中的第4節“表

Lua 5.1源代碼 - table.c

這個想法與Roberto Ierusalimschy以及Lua團隊的其他成員原創。 我聽說羅伯托在2003年麻省理工學院輕量級語言研討會上就此進行了討論,在這次演講中,他討論了以前的工作並且令人信服地認為這個想法是新的。 我不知道其他語言是否已經復制過它。

最初的Awk語言模型比Lua更受限制; 數字或字符串可以用作數組中的鍵,但數組本身不是第一類值:數組必須具有名稱,並且數組不能用作數組中的鍵。

關於實現,我檢查了由Brian Kernighan維護的原始Awk的源代碼,並且Awk的實現使用哈希表,而不是Lua的混合數組/表結構。 區別很重要,因為在Lua中,當表與連續的整數鍵一起使用時,空間開銷與C數組相同。 原始的Awk 不是這樣。

我沒有費心去調查awk的所有后續實現,例如Gnu Awk,mawk等等。

編輯: 這不回答關於實施的問題。

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也是這個語法的糖(?)。

我能想到的最接近的是Javascript - 你用new Array()創建一個數組,然后按數字或字符串值繼續索引。 出於性能原因,一些Javascript實現可能會選擇使用兩個數組,原因是您鏈接到的Lua文檔中提到的原因。

ArrayWithHash是C ++中數組哈希表混合的快速實現。

由於C ++是靜態類型語言,因此ArrayWithHash中只允許使用整數鍵(無法插入字符串或指針鍵)。 換句話說,它類似於具有大型索引的哈希表備份的數組。 它還使用不同的哈希表實現,這比Lua表實現的內存效率低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM