[arrays] Lua 배열 (테이블)이 0 대신 1에서 시작하는 이유는 무엇입니까?

나는 Lua의이 부분이 결정한 이유를 이해하지 못합니다. 인덱싱이 1부터 시작하는 이유는 무엇입니까? 나는 (많은 다른 사람들이 그랬듯이) 이 훌륭한 논문 을 읽었습니다 . 배우고 프로그래밍하는 것이 매우 즐거운 언어의 이상한 구석 인 것 같습니다. 오해하지 마십시오. Lua는 훌륭하지만 어딘가에 설명이 있어야합니다. 내가 찾은 것 (웹에서)의 대부분은 인덱스가 1에서 시작한다는 것입니다. Full stop.

디자이너가 그 주제에 대해 말한 것을 읽는 것은 매우 흥미로울 것입니다.

나는 Lua의 “매우”초보자라는 점에 유의하십시오. 테이블에 대해 분명한 것을 놓치고 싶지 않기를 바랍니다.



답변

Lua는 컴퓨터 프로그래밍에 대한 공식 교육없이 석유 엔지니어를 위해 설계된 언어 인 Sol의 후손입니다. 컴퓨팅 교육을받지 않은 사람들은 0부터 세는 것이 이상하다고 생각합니다. 1 기반 배열 및 문자열 인덱싱을 채택함으로써 Lua 디자이너는 첫 번째 고객과 후원자의 기대치를 혼란스럽게하는 것을 피했습니다.

저도 처음에는 이상하다고 생각했지만 0 기반 배열을 좋아하는 법을 배웠습니다. 그러나 저는 특히 Lua의 일반 for루프와 ipairs연산자 를 사용하여 Lua의 1 기반 배열을 사용하면 괜찮습니다. 일반적으로 배열이 인덱싱되는 방식에 대해 걱정하지 않아도됩니다.


답변

루아에서 프로그래밍 테이블의 첫 번째 토론, 그들은 언급 :

어떤 값 으로든 테이블을 인덱싱 할 수 있으므로 원하는 숫자로 배열 인덱스를 시작할 수 있습니다. 그러나 Lua에서는 배열을 1 (C에서와 같이 0이 아닌)로 시작하는 것이 일반적이며 여러 기능이이 규칙을 고수합니다.

나중에 데이터 구조에 관한 장에서 그들은 거의 같은 말을합니다 : Lua의 내장 기능은 1 기반 인덱싱을 가정한다는 것입니다.

어쨌든 1 기반 인덱싱을 사용 하면 몇 가지 편리함이 있습니다. 즉, #(길이) 연산자 : t[#t]테이블의 마지막 (숫자) 인덱스에 t[#t+1]액세스 하고 마지막 인덱스를 지나 1에 액세스 합니다. 아직 0 기반 인덱싱에 노출되지 않은 사람에게는 #t+1목록 끝을 지나가는 것이 더 직관적 일 것입니다. 루아의 for i = 1,#t구조 도 있는데 , “길이에 1″이 “길이에 1을 뺀 값”을 인덱싱하는 것보다 더 현명 할 수 있다는 이전 포인트와 같은 범주에 속한다고 생각합니다.

그러나 0 기반 인덱싱의 사고 방식을 깰 수 없다면 Lua의 1 기반 인덱싱은 확실히 더 방해가 될 수 있습니다. 궁극적으로 저자들은 그들에게 효과가있는 무언가를 원 했습니다 . 그리고 나는 그들의 원래 목표가 무엇이 었는지는 모르겠지만 그 이후로 아마도 변경되었을 것입니다.


답변

저의 이해는 저자들이 그렇게하는 것이 좋은 방법이라고 생각했기 때문이며, 대중에게 언어를 공개 한 후 결정이 상당히 석회화되었습니다. (나는 그들이 오늘 그것을 바꾸면 지불해야 할 지옥이있을 것이라고 생각한다!) 나는 그 이상의 특별한 정당성을 본 적이 없다.


답변

아마도 덜 중요한 점이지만 아직 언급하지 않은 점은 문자열의 첫 번째 문자와 마지막 문자가 각각 0과 -1이 아니라 1과 -1이라는 사실에서 더 나은 대칭이 있습니다.


답변

Lua 라이브러리는 1부터 시작하는 인덱스를 사용하는 것을 선호합니다. 그러나 원하는 모든 인덱스를 사용할 수 있습니다. 0, 1, -5를 사용할 수 있습니다. 설명서에도 나와 있으며 ( https://www.lua.org/pil/11.1.html ) 에서 찾을 수 있습니다 .

사실, 여기서 멋진 것은 내부 루아 라이브러리가 0이 전달 된 일부를 1로 취급한다는 것입니다. ipair를 사용할 때주의하십시오.
그래서 : ("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"사실이 될 것입니다.

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end


답변

진짜 이유는이 언어가 포르투갈 법률의 정의를 구현 한 것이며 주요 개발 센터가 브라질에 있었기 때문에 색인이나 첨자로 0 또는 비어 있거나 아무것도 사용하지 않는 것이 선호됩니다. 그러나 언어는 일부 버전의 테이블 생성 함수에서 1이 아닌 시작 인덱스의 사용을 허용합니다.


답변

table [0]은 값을 직접 할당하지 않는 한 항상 nil (null)을 반환합니다. table [0] = ‘some value’다음 table [0]은 할당 한 ‘some value’를 반환합니다.

다음은 예입니다.

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))