लुआ arrays (तालिकाओं) 0 के बजाय 1 पर क्यों शुरू होता है?


125

मैं लुआ के इस हिस्से के फैसले के पीछे के तर्क को नहीं समझता। इंडेक्सिंग 1 पर क्यों शुरू होती है? मैंने इस महान पत्र को पढ़ा है (जैसा कि कई अन्य लोगों ने किया है) । यह मुझे एक भाषा का एक अजीब सा कोना लगता है जो सीखने और कार्यक्रम के लिए बहुत ही सुखद है। मुझे गलत मत समझो, लुआ सिर्फ महान है लेकिन कहीं न कहीं एक स्पष्टीकरण होना चाहिए। मैंने (वेब ​​पर) जो कुछ पाया, उसमें से अधिकांश इंडेक्स 1. स्टॉप पर शुरू होता है।

यह पढ़ना बहुत दिलचस्प होगा कि इसके डिजाइनरों ने इस विषय के बारे में क्या कहा।

ध्यान दें कि मैं लुआ में "बहुत" शुरुआती हूं, मुझे आशा है कि मैं तालिकाओं के बारे में कुछ स्पष्ट याद नहीं कर रहा हूं।


23
डिफ़ॉल्ट स्कोप भी वैश्विक है। लुआ के दो सबसे बड़े मिसफिट्स।
यन रामिन

37
मैं 1 मिसफिट पर शुरू नहीं कहूंगा। यह वास्तव में अधिक समझ में आता है - प्रोग्रामर केवल 0-आधारित अनुक्रमण के संदर्भ में अन्य भाषाओं से सोचने के लिए इतनी अच्छी तरह प्रशिक्षित हैं कि हम इसे पसंद नहीं करते हैं। हमें 5/2 = 2. सोचने के लिए भी प्रशिक्षित किया जाता है।
ब्लूराजा - डैनी पीफ्लुगुएफ्ट

54
@ BlueRaja-DannyPflughoeft: नहीं। शून्य अनुक्रमण अधिक मायने रखता है - मनुष्य केवल 1 के साथ गिनती शुरू करने में इतनी अच्छी तरह प्रशिक्षित हैं कि 0 से शुरू होने वाली भाषाएं शुरू में भ्रमित हैं। लेकिन मैं आपको यहां दिगर दिक्स्ट्रा में
orlp

11
@ नाइटक्रैकर: जब आप एक मेज पर सेब की गिनती करते हैं, तो आप पहले वाले को "एक," दूसरे को "दो," आदि के रूप में गिनते हैं। कोई भी पहले को "शून्य" के रूप में नहीं गिनता है और फिर अंत में एक जोड़ता है; शून्य से गिनती बस, unarguably, काउंटर-सहज ज्ञान युक्त है। हां, मुझे एहसास है कि अनुक्रमण आंतरिक रूप से कैसे काम करता है, लेकिन इसीलिए हम इसे अमूर्त कहते हैं।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

9
मैंने 0-आधारित अनुक्रमण के प्रति सभी प्रेम को कभी नहीं समझा। यह ऑफ़सेट्स के लिए अच्छा है (शुरुआत से कितने आइटम छोड़ना है?) और बाद का (0 <x <n), लेकिन बुनियादी चीजों के लिए गलत दिखता है (दूसरे तत्व को एक कहा जाता है? दसवां तत्व सूचकांक नौ से संबंधित है? वाट?) । यहां तक कि प्रोग्रामर 1 से गिनती जब वे एक लाइन संकलक द्वारा रिपोर्ट खोजने की कोशिश ...
मार्कस

जवाबों:


143

लुआ को सोल से उतारा गया है, जो कंप्यूटर इंजीनियरों के लिए डिज़ाइन की गई भाषा है, जिसमें कंप्यूटर प्रोग्रामिंग में कोई औपचारिक प्रशिक्षण नहीं है। कंप्यूटिंग में प्रशिक्षित लोगों को लगता है कि शून्य पर गिनती शुरू करना अजीब है। 1-आधारित सरणी और स्ट्रिंग इंडेक्सिंग को अपनाकर, Lua डिजाइनरों ने अपने पहले ग्राहकों और प्रायोजकों की उम्मीदों को पूरा करने से परहेज किया।

हालाँकि मुझे भी शुरुआत में अजीब लगा, मैंने 0-आधारित सरणियों से प्यार करना सीख लिया है। लेकिन मुझे लुका के 1-आधारित सरणियों के साथ ओके मिलता है, विशेष रूप से लूआ के जेनेरिक forलूप और ipairsऑपरेटर का उपयोग करके - मैं आमतौर पर इस बारे में चिंता करने से बच सकता हूं कि कैसे सरणियों को अनुक्रमित किया जाता है।


7
यह सिर्फ एक ऐतिहासिक, विपणन कारण है। कोई तर्कसंगत कारण नहीं, खासकर मौजूदा समय में। और ऐसा लगता है कि आप इसका उपयोग करने के बजाय 1-आधारित अनुक्रमण से बचने की कोशिश कर रहे हैं :)
eonil

27
@Eonil वास्तव में स्पष्ट अनुक्रमण से बचने के लिए अनुक्रमण त्रुटियों को कम करता है।
डेन डी।

8
@Eonil ऐतिहासिक कारण आमतौर पर प्रासंगिक हैं। आप कुछ के साथ शुरू करते हैं, और फिर आप इसे कभी नहीं बदल सकते, क्योंकि यह सभी मौजूदा कोड को तोड़ देगा। विशेष रूप से 0 बनाम 1 अनुक्रमण के लिए बुरा है, क्योंकि यह जिस तरह से टूट जाता है वह बहुत सूक्ष्म है।
कोडइन्चोस

5
अंतर 1 से लंबाई और 0 से लंबाई -1 तक जाने के बीच है, लेकिन लूप के < lengthलिए "अजीब 0-आधारित भाषाओं" को पढ़ना ज्यादा आसान और आसान है। मैं कबूल करता हूं जब मुझे 1 से एक लूप दिखाई देता है, मैं तुरंत मान लेता हूं कि यह 2 तत्व से शुरू होता है: S
Felype

45

लुआ की तालिकाओं की पहली चर्चा में प्रोग्रामिंग में , वे उल्लेख करते हैं:

चूंकि आप किसी भी मूल्य के साथ एक तालिका को अनुक्रमित कर सकते हैं, आप किसी भी संख्या के साथ एक सरणी के सूचकांक को शुरू कर सकते हैं जो आपको प्रसन्न करता है। हालाँकि, यह लुआ में प्रथागत है 1 के साथ सरणियों को शुरू करने के लिए (और 0 के साथ नहीं, जैसा कि सी में) और कई सुविधाएं इस सम्मेलन से चिपकी रहती हैं।

बाद में, डेटा संरचनाओं पर अध्याय में, वे लगभग एक ही बात फिर से कहते हैं: लूआ की अंतर्निहित सुविधाओं को 1-आधारित अनुक्रमण मान लेते हैं।

वैसे भी, 1-आधारित अनुक्रमण का उपयोग करने के लिए कुछ उपयुक्तताएं हैं। अर्थात्, #(लम्बाई) ऑपरेटर: t[#t]पहुँच पिछले (अंकीय) तालिका के सूचकांक, और t[#t+1]पहुँचता 1 अतीत पिछले सूचकांक। किसी व्यक्ति के लिए जो पहले से ही 0-आधारित अनुक्रमणिका के संपर्क में नहीं आया है, #t+1किसी सूची के अंत में स्थानांतरित करने के लिए अधिक सहज होगा। लुआ का for i = 1,#tनिर्माण भी है , जो मुझे लगता है कि पिछले बिंदु के समान श्रेणी में आता है कि "1 से लंबाई", "0 से लंबाई शून्य 1" को अनुक्रमित करने से अधिक समझदार हो सकता है।

लेकिन, यदि आप 0-आधारित इंडेक्सिंग की मानसिकता को नहीं तोड़ सकते हैं, तो लूआ का 1-आधारित इंडेक्सिंग निश्चित रूप से बाधा बन सकता है। अंत में, लेखकों कुछ है कि के लिए काम किया चाहता था उन्हें ; और मैं मानता हूँ कि मैं नहीं जानता कि उनका मूल लक्ष्य क्या था, लेकिन यह तब से शायद बदल गया है।


16

मेरी समझ यह है कि यह सिर्फ इसलिए है क्योंकि लेखकों ने सोचा कि यह इसे करने का एक अच्छा तरीका होगा, और उन्होंने भाषा को सार्वजनिक करने के बाद उस निर्णय को काफी हद तक शांत किया। (मुझे संदेह है कि भुगतान करने के लिए नरक होगा वे आज इसे बदलने के लिए थे!) मैंने कभी भी इससे परे कोई विशेष औचित्य नहीं देखा है।


6
संभव औचित्य: सी केवल इसलिए किया क्योंकि एक सरणी मूल रूप से सिर्फ एक सूचक है और array[0] == array + 0;, और 1-आधारित गणना अधिक स्वाभाविक है जब सरणी वास्तव में एक हैश तालिका है।
जज मेगार्डन

19
लुआ सूचकांक वास्तव में सूचकांक हैं। C में जब आप इंडेक्स कहते हैं कि आपका वास्तव में क्या मतलब है ऑफसेट है।
एलेक्स

8

शायद एक कम महत्वपूर्ण बिंदु, लेकिन एक मैंने अभी तक नहीं सुना है: इस तथ्य में बेहतर समरूपता है कि एक स्ट्रिंग में पहले और अंतिम वर्ण 0 और -1 के बजाय क्रमशः 1 और -1 पर हैं।


8
हालांकि यह अच्छा है, यह
1.23

3

लुआ लाइब्रेरी 1 से शुरू होने वाले सूचकांकों का उपयोग करना पसंद करते हैं। हालांकि, आप अपने इच्छित किसी भी सूचकांक का उपयोग कर सकते हैं। आप 0 का उपयोग कर सकते हैं, आप 1 का उपयोग कर सकते हैं, आप -5 का उपयोग कर सकते हैं। यह उनके मैनुअल में भी है, जो ( https://www.lua.org/pil/11.1.html ) पर पाया जा सकता है ।

वास्तव में, यहाँ कुछ ठंडा है आंतरिक लुआ पुस्तकालयों ने कुछ को 0 के 1 के रूप में पारित किया है। आईपी ​​का उपयोग करते समय बस सतर्क रहें।
ताकि: ("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

हालांकि, ({'a', 'b'})[1]मूल्यांकन करने का 'b'कोई तरीका नहीं 'a'है? यह मेरे लिए अंतर्निहित लगता है।
रेराम

1
({[0] = 'a', 'b'})[1]
user2262111

0

वास्तविक कारण यह है कि भाषा पुर्तगाल के एक कानून में परिभाषा का कार्यान्वयन है और प्रमुख विकास केंद्र ब्राजील में था और उनकी प्राथमिकता शून्य या खाली के उपयोग से बचना है या सूचकांक या सबस्क्रिप्ट के रूप में कुछ भी नहीं है। हालाँकि भाषा कुछ संस्करणों में फ़ंक्शन बनाने वाली तालिका में 1 के अलावा एक स्टार्ट इंडेक्स के उपयोग की अनुमति देती है।


5
यहां तक ​​कि अगर यह सच है, तो यह बिल्कुल भी प्रासंगिक नहीं है कि लूआ को कैसे डिजाइन किया गया था।
lhf

-1

तालिका [0] हमेशा शून्य (शून्य) वापस आएगी, तब तक आप इसे अपने आप को मूल्य प्रदान करते हैं तालिका [०] = 0 कुछ मूल्य ’और फिर तालिका [0] 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]))

-11

यह हर एक को समझ में आता है, कि अगर ए

table = {}

फिलहाल, tableखाली है। तो कब

table == {something}

तालिका में कुछ है तो इसमें जो कुछ है वह अनुक्रमणिका 1 है table यदि आप जानते हैं कि मेरा क्या मतलब है।

मेरा मतलब है कि इसकी तालिका [0] मौजूद है, और इसकी तालिका = {}, जो इसकी खाली है, अब एक प्रोग्रामर एक खाली टेबल को कॉल नहीं करेगा, यह उन्हें सेट करता है, और फिर इसे भरता है, एक खाली खोजना बेकार होगा तालिका हर बार जब आप इसे कॉल करना चाहते हैं, तो इसका सरल तरीका सिर्फ एक खाली तालिका बनाना है।

मेरी अंग्रेजी बेहतर नहीं होगी और यह मेरा सबसे अच्छा व्याकरण है। यदि आप इसे पसंद नहीं करते हैं, तो इसे पढ़ने के लिए नहीं रखने के लिए आपका स्वतंत्र है, लेकिन मदद करने वाले किसी व्यक्ति के लिए -rep देना लोगों को बिल्कुल भी मदद नहीं करना चाहता है, खासकर व्याकरण जैसी किसी चीज के लिए। मैं नंबर और वर्जन का आदमी हूं, व्याकरण का नहीं। माफ़ करना।


4
मुझे किसी तालिका की अवधारणा का महत्व नहीं मिलता है। 0. एक तालिका की लंबाई 0. हो सकती है, लेकिन यह पहली सूची के विकल्प से स्वतंत्र है। मुझे छोटी व्याकरण की गलतियों की परवाह नहीं है, लेकिन मुझे बस आपके उत्तर की बात समझ में नहीं आ रही है, यही कारण है कि मैंने इसे अस्वीकार कर दिया है।
कोडइन्चोस

मैं जो कुछ भी उल्लेख करता हूं, वह एक तालिका के साथ 0 इंडेक्स या मान के साथ होना चाहिए, क्योंकि हम इसे एक खाली तालिका के रूप में उपयोग करते हैं <, <जब आपके पास यह कुछ ऐसा है जिसका प्रतिनिधित्व 1 से किया जाता है, तो "n" इसलिए जब आपके पास कुछ नहीं है, तो आपका खाली कुछ है, जो हमें एक cero की ओर ले जाता है, लेकिन cero dosnt count, lua इसकी एक पेंगुइन है जो व्यावहारिक रूप से आता है, आप बाहर न जाएं और अपने दोस्तों को बताएं कि आपके पास क्या पता है कि उस कलाकार के 0 गाने हैं, जो आप कुछ हैं, या आप न। बिंदु इसकी तालिका = {} एक खाली तालिका
Wesker

5
एक सरणी जो 0केवल तत्व के रूप में सूचकांक का उपयोग करता है वह अभी भी खाली नहीं है। वास्तव में लुआ इसका समर्थन करता है, यह सिर्फ डिफ़ॉल्ट सम्मेलन नहीं है।
कोडइन्चोस

हाँ, मैं आपसे कुछ अन्य लिंगों पर सहमत हूं, लेकिन लुआ नहीं, लुआ इंडेक्स 0 डॉसेंट मौजूद है, इसलिए हम इसे एक खाली = 0 की तरह कल्पना कर सकते हैं, या यह है कि मैं इसे कैसे दिखाता हूं, तब भी जब आप इंडेक्स को 0 होने के लिए मजबूर कर सकते हैं। यह टेबल के मानों के साथ काम नहीं करेगा। # अभ्यस्त 0 इंडेक्स को पढ़ेगा, इसलिए मेरा जवाब है कि इसका मूल रूप से एक नियमित घटना की तरह बनाया गया है, अब अगर वे इस का इरादा रखते हैं या नहीं, तो यह वास्तव में प्रासंगिक नहीं है कि आप फिर से छेद कोड लिखें, और हम इसके बारे में कुछ भी नहीं कर सकते: /, मैं अभी भी विश्वास है कि इसके निष्पक्ष कहने के लिए कि एक खाली तालिका में एक 0 सूचकांक है
Wesker
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.