Lua的表的實現將其元素分爲兩部分:數組部分和散列部分。Lua的混合數組和哈希表;它存在於其他地方嗎?
這樣的事情是否存在於任何其他語言?
查看The Implementation of Lua 5.0中的第4部分表格。
Lua的表的實現將其元素分爲兩部分:數組部分和散列部分。Lua的混合數組和哈希表;它存在於其他地方嗎?
這樣的事情是否存在於任何其他語言?
查看The Implementation of Lua 5.0中的第4部分表格。
這個想法原來是Roberto Ierusalimschy和Lua團隊的其他成員。在2003年的MIT輕量級語言研討會上,我聽羅伯託講過這個話題,在這次演講中,他討論了之前的工作,並且令人信服地爭辯說這個想法是新的。我不知道其他語言是否已經複製過。
最初的Awk比Lua的語言模型更受限制;數組或字符串都可以用作數組中的鍵,但是數組本身並不是第一類值:數組必須有名稱,並且數組不能用作數組中的鍵。
關於實現,我檢查了由Brian Kernighan維護的原始Awk的源代碼,並且Awk的實現使用了散列表,而不是Lua的混合數組/表結構。區別非常重要,因爲在Lua中,當一個表與連續的整數鍵一起使用時,空間開銷與C數組相同。原始Awk爲而不是。
我沒有打算研究awk的所有後來的實現,例如,Gnu Awk,mawk等等。
我能想到的最接近的是使用Javascript - 創建一個數組new Array()
,然後或者是通過編號或字符串值進行索引。由於性能方面的原因,一些Javascript實現選擇使用兩個數組,因爲您鏈接到的Lua文檔中提到的原因。
編輯:這並沒有回答這個問題,這是關於實施。
AWK也做到了。
它interesing某些語言如何混爲一談是在其他國家不同的操作:
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
是語法糖這也太(?)。
ArrayWithHash是在C++中快速實現array-hashtable混合。
由於C++是一種靜態類型語言,ArrayWithHash中只允許使用整數鍵(無法插入字符串或指針鍵)。換句話說,它就像一個具有大型索引散列表備份的數組。它也使用不同的哈希表實現,這比Lua表實現具有更低的內存效率。
Fortress和Clojure還將地圖作爲它們的鍵和數組的函數作爲其索引的函數。畢竟,他們*是*。 – 2010-01-25 04:30:53
問題是關於實現,而不是語言模型。原來的awk,仍然由Brian Kernighan維護,使用一個哈希表。 – 2010-01-26 01:53:59
你是對的,我完全錯過了印記!不能downvote自己,所以+1給你的答案。 – 2010-01-27 17:23:24