標籤:

Lua 的 table 索引默認從 1 開始,這樣做有什麼好處?


lua的語法就是繼承pascal啊,默認從1開始


作者認為這樣對於非專業的開發者來說更友好更容易理解。

Lua lists have a base index of 1 because it was thought to be most friendly for non-programmers, as it makes indices correspond to ordinal element positions.

也確實,對於我們數數來說,總是從1開始數的,而從0開始對於描述偏移量這樣的東西有利。Lua最初設計是一種類似XML的數據描述語言,所以索引(index)反應的是數據在裡面的位置,而不是偏移量

不僅僅是table,字元串的索引也是從1開始的,這樣子數字元串位置的時候再也不用調整了,對於非專業的開發者來說可能也是一個好事情,string.sub(str, 3, 7)直接表示從第三個字元開始到第七個字元(含)為止的子串。

從其他語言過來的開發者會覺得比較坑的一點是,當我們把table當作棧或者隊列使用的時候,容易犯錯,追加到table的末尾用的是s[#s+1] = something,而不是s[#s] = something,而且如果這個something是一個nil的話,會導致這一次壓棧(或者入隊列)沒有存入任何東西,#s的值沒有變。如果s = { 1, 2, 3, 4, 5, 6 },你令s[4] = nil,#s會令你「為夷所思」地變成3。

更多討論請看官方文章:lua-users wiki: Counting From One


好處在於,告訴你這不是一個 offset。

從零開始的語言,必須支持這樣的用法,才是一個 consistent 的語言:

int a[] = {1, 2, 3};
int b = 1[a]; // b &<= 2 int c = *(2 + a) // c &<= 3

你要不支持這個,乾脆就別學人家從零開始。


口味問題而已,basic也是這麼做的,pascal的話甚至你可以隨意指定下標


1. Lua 誕生於巴西 PUC-Rio 大學的 Tecgraf 實驗室。Tecgraf 實驗室最大的合作夥伴之一是巴西國有石油公司 Petrobras。Lua 第一批用戶只是石油公司的工程師,另外許多潛在用戶也並非專業的程序員。對沒有受過編程訓練的人來說,計數從 1 開始更符合習慣,所以語言設計時選擇下標為1開始。

2. Lua 選擇從 1 開始計數後,應用這個選擇來設計標準庫和 API。Lua 實現了一個虛擬棧,和 C 交換數據都通過這個虛擬棧進行。訪問這個虛擬棧也是用下標。正數 1、2、3、4 表示從棧底數起,負數 -1、-2、-3、-4 表示從棧頂數起。0 不合法。其它標準庫也是這個思路,如字元串 1、2、3 表示從前面向後數,-1、-2、-3表示從後面往前數。而用 0 作為下標開始,就不能這樣做了,因為 0 沒有相反數。


C系語言的數組把offset和index混起來用, 這是所有初學者第一個覺得莫名其妙的地方, 我猜lua是想把他們區分開. 實際上如果一個語言大部分的實現不涉及到內存以及其他底層的東西, 它確實不應該把offset這種東西給程序員.

好處就是沒學過C系和類C語言的人可以很自然地用它, 而學過C和類C並且理解了offset的人也能在愣一下之後很快適應它


坦白說,當年我有很長一段時間都很憤怒為啥編程語言的數組索引都從0開始。


lua設計的初衷是給非程序員使用的,用在一些配置文件之類的地方。對於非程序員來說,自然從一開始數比較正常了。比如css中的nth-child,xpath的計數都是1開始的。


因為lua 並不是一個注重記憶體存取的語言,索引對使用者的意義就是讀取的鍵值。1 在語意上有"第一個"的意思。

然而在很多語言中,0 有"記憶指針由沒有偏移量的點開始讀取" 這個含意。


私以為索引從1開始的話,整數除法也要向上抹零的好


從1開始我忍了

~=是要鬧甚 = =!


從1開始,另外還有空字元串為真


當然對於任何一個面向程序員的編程語言來說,數組下標從1開始都是一個失敗的設計。

唯一的好處是實現最小堆的時候方便了一點點。。。


程序寫懵逼的適合,坐電梯就不會找「0」層在哪了!!!


為了用 table.maxn() 區分 table 是作為 array 或者是 dict。


Matlab、Mathematica、Maple的索引都是從1開始的


符合人的思維習慣...在lua程序設計中(第二版),作者提到,lua的定位還兼顧了一些業餘編程愛好者..


不少靈巧的索引設計一般都把0當成ERROR訪問,實際從1開始,可能也是原因之一吧


LUA的索引默認從1開始,更加符合人們的計數習慣!這是新語言的趨勢。


推薦閱讀:

intel x86系列CPU既然是strong order的,不會出現loadload亂序,為什麼還需要lfence指令?
說說你使用Elixir/phoenix的實戰項目心得,以及對該語言/框架的前景的看法?
C++中有变量a,b,c,d,e,f作为条件表达式:如果其中任意2个及以上相同则表达式为假。怎样写?
C++高級編程、Windows程序設計和MFC,這三者學習的順序?
MFC 中 CString 與 std::string 如何相互轉換?

TAG:編程語言 | Lua |