লুয়া অ্যারে (টেবিল) কেন 0 এর পরিবর্তে 1 এ শুরু হবে?


125

লুয়ার এই অংশের সিদ্ধান্তের পিছনে যুক্তি আমি বুঝতে পারি না। 1 থেকে সূচকের সূচনা কেন হয়? আমি এই দুর্দান্ত কাগজটি পড়েছি (আরও অনেকেই করেছেন) । এটি আমার কাছে এমন একটি ভাষার এক অদ্ভুত কোণা বলে মনে হয়েছে যা শিখতে এবং প্রোগ্রাম করতে খুব মনোরম। আমাকে ভুল করবেন না, লুয়া ঠিক দুর্দান্ত তবে কোথাও কোনও ব্যাখ্যা থাকতে হবে। আমি (ওয়েবে) যা পেয়েছি তার বেশিরভাগই সূচকটি ১ থেকে শুরু করে বলে চলেছে Full ফুল স্টপ।

বিষয়টি সম্পর্কে এর ডিজাইনাররা কী বলেছেন তা পড়তে খুব আকর্ষণীয় হবে।

নোট করুন যে আমি লুয়ার "খুব" শিক্ষানবিশ, আমি আশা করি আমি টেবিলগুলি সম্পর্কে স্পষ্টত কিছু মিস করছি না।


23
ডিফল্ট সুযোগটিও বিশ্বব্যাপী। লুয়ার সবচেয়ে বড় দু'টি অপশারণ।
ইয়ান রামিন

37
আমি 1 থেকে শুরু করে একটি ভুল ধারণা বলব না। এটি প্রকৃতপক্ষে আরও বোধগম্য হয় - প্রোগ্রামাররা অন্যান্য ভাষা থেকে 0-ভিত্তিক সূচকের বিবেচনার জন্য ঠিক এতটাই প্রশিক্ষিত হন যে আমরা এটি পছন্দ করি না। আমরা 5/2 = 2 ভাবতেও প্রশিক্ষণ পেয়েছি যা এটি সঠিক করে তোলে না।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

54
@ ব্লুরাজা-ড্যানিপ্লুঘুফুট: না। জিরো ইনডেক্সিং আরও অর্থবোধ তৈরি করে - 1 টি দিয়ে গণনা শুরু করার জন্য মানুষ ঠিক এতটা প্রশিক্ষণ পেয়েছে যে 0 দিয়ে শুরু হওয়া ভাষাগুলি প্রাথমিকভাবে বিভ্রান্ত করে। তবে আমি আপনাকে এখানে এডজার ডিজকস্ট্রা
orlp

11
@ নাইটক্র্যাকার: আপনি যখন কোনও টেবিলে আপেল গণনা করেন, আপনি প্রথমটিকে "এক," দ্বিতীয়টিকে "দুটি" হিসাবে গণনা করেন । কেউ প্রথমটিকে "শূন্য" হিসাবে গণনা করে না এবং শেষে একটি যোগ করে; শূন্য থেকে গণনা সহজ, নিরপেক্ষভাবে, পাল্টা স্বজ্ঞাত। হ্যাঁ, আমি বুঝতে পারি যে সূচকগুলি অভ্যন্তরীণভাবে কীভাবে কাজ করে তবে আমরা একে বিমূর্ততা বলি।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

9
0-ভিত্তিক সূচকের দিকে সমস্ত ভালবাসা আমি কখনই বুঝতে পারি নি। এটি অফসেটের জন্য (কতগুলি আইটেম শুরু থেকে এড়িয়ে যেতে পারে?) এবং উপসর্গগুলি (0 ≤ x <n) এর জন্য দুর্দান্ত, তবে মৌলিক জিনিসগুলির জন্য ভুল দেখাচ্ছে (দ্বিতীয় উপাদানটিকে একটি বলা হয়? দশম উপাদানটি নয়টি সূচকের সাথে মিলেছে? ওয়াট?) । এমনকি প্রোগ্রামাররা 1 থেকে গণনা করা হয় যখন তারা সংকলক দ্বারা রিপোর্ট করা একটি লাইন খোঁজার চেষ্টা করে ...
মার্কাস

উত্তর:


143

লুয়া কম্পিউটার প্রোগ্রামিংয়ের কোনও আনুষ্ঠানিক প্রশিক্ষণ ছাড়াই পেট্রোলিয়াম ইঞ্জিনিয়ারদের জন্য তৈরি ভাষা সোলের বংশোদ্ভূত। গণনা প্রশিক্ষণপ্রাপ্ত লোকেরা শূন্য থেকে গণনা শুরু করা অদ্ভুত বলে মনে করে। 1-ভিত্তিক অ্যারে এবং স্ট্রিং সূচক গ্রহণ করে, লুয়া ডিজাইনাররা তাদের প্রথম ক্লায়েন্ট এবং স্পনসরদের প্রত্যাশাকে বিস্মৃত করা এড়িয়ে চলেন।

যদিও আমি তাদের প্রথমদিকেই অদ্ভুত বলে মনে করেছি, তবে আমি 0-ভিত্তিক অ্যারেগুলি পছন্দ করতে শিখেছি। তবে আমি লুয়ার 1-ভিত্তিক অ্যারেগুলিতে ঠিক আছে, বিশেষত লুয়ার জেনেরিক forলুপ এবং ipairsঅপারেটরটি ব্যবহার করে — আমি সাধারণত অ্যারেগুলি কীভাবে সূচিবদ্ধ করা হয় তা নিয়ে উদ্বেগ এড়াতে পারি।


7
এটি কেবল একটি .তিহাসিক, বিপণনের কারণ। যৌক্তিক কারণ নেই, বিশেষ করে বর্তমান সময়ে। এমনকি দেখে মনে হচ্ছে আপনি এটি ব্যবহার করার পরিবর্তে 1-ভিত্তিক সূচী এড়ানোর চেষ্টা করছেন :)
ইওনিল

27
@ ইউনিল প্রকৃতপক্ষে সুস্পষ্ট সূচী এড়ানো সূচীকরণের ত্রুটি হ্রাস করে।
ড্যান ডি

8
@ ইউনিল historicতিহাসিক কারণগুলি সাধারণত সম্পর্কিত হয়। আপনি কোনও কিছু দিয়ে শুরু করেন এবং তারপরে আপনি কখনই এটি পরিবর্তন করতে পারবেন না কারণ এটি বিদ্যমান বিদ্যমান কোডটি ভেঙে দেবে। বিশেষত 0 বনাম 1 সূচকের জন্য খারাপ, যেহেতু এটি ভাঙার উপায়টি খুব সূক্ষ্ম।
কোডসইনচাউস

5
পার্থক্যটি 1 থেকে দৈর্ঘ্য এবং 0 থেকে দৈর্ঘ্য -1 এ যাওয়ার মধ্যে রয়েছে তবে লুপের জন্য < length"অদ্ভুত 0-ভিত্তিক ভাষাগুলি" পড়তে আরও বেশি সুবিধাজনক এবং সহজ। আমি স্বীকার করি যখন আমি 1 টি থেকে একটি লুপটি আবার ঘুরতে দেখি, আমি তাত্ক্ষণিকভাবে ধরে নিই যে এটি দ্বিতীয় উপাদান থেকে শুরু হয়: এস
ফেলিপ

45

ইন অ্যাপ্লিকেশন Lua প্রোগ্রামিং এর টেবিল প্রথম আলোচনা, তারা উল্লেখ:

যেহেতু আপনি কোনও মান সহ একটি সারণী সূচী করতে পারেন, আপনি যে কোনও সংখ্যার সাথে আপনাকে খুশি করে কোনও অ্যারের সূচকগুলি শুরু করতে পারেন। তবে লুয়ায় 1 (এবং 0 এর সাথে সি হিসাবে নয়) দিয়ে অ্যারে শুরু করার প্রচলন রয়েছে এবং বেশ কয়েকটি সুবিধা এই সম্মেলনে আটকে রয়েছে।

পরবর্তীকালে, ডেটা স্ট্রাকচার সম্পর্কিত অধ্যায়ে, তারা আবার প্রায় একই জিনিস বলে: লুয়ার অন্তর্নির্মিত সুবিধাগুলি 1-ভিত্তিক সূচককে ধরে নিয়েছে।

যাইহোক, 1-ভিত্তিক সূচক ব্যবহারের জন্য বেশ কয়েকটি সুবিধা রয়েছে ien যেমন, #(দৈর্ঘ্য) অপারেটর: t[#t]এক্সেস গত (সাংখ্যিক) টেবিলের সূচক, এবং t[#t+1]ব্যবহারের 1 অতীত গত সূচি। ইতিমধ্যে 0-ভিত্তিক সূচকের বাইরে না আসা এমন ব্যক্তির কাছে, #t+1তালিকার শেষের দিকে যেতে আরও স্বজ্ঞাত হতে হবে। লুয়ার নির্মাণও রয়েছে for i = 1,#t, যা আমি বিশ্বাস করি যে "1 দৈর্ঘ্যের" দৈর্ঘ্য বিয়োগ 1 থেকে "1 এর দৈর্ঘ্যে" সূচিকাগুলির চেয়ে আরও বুদ্ধিমান হতে পারে believe

তবে, যদি আপনি 0-ভিত্তিক সূচকের মানসিকতাটি ভাঙ্গতে না পারেন তবে লুয়ার 1-ভিত্তিক সূচীকরণ অবশ্যই আরও বাধা হতে পারে। শেষ পর্যন্ত লেখকরা এমন কিছু চেয়েছিলেন যা তাদের পক্ষে কাজ করেছিল ; এবং আমি স্বীকার করব যে তাদের মূল লক্ষ্যটি আমি কী তা জানি না , তবে সম্ভবত এটি তখন থেকেই পরিবর্তিত হয়েছে।


16

আমার বোধগম্যতা হ'ল এই কারণেই লেখকরা ভেবেছিলেন এটি করা ভাল উপায় হবে এবং তারা জনগণের কাছে ভাষায় পরিণত করার পরে সেই সিদ্ধান্তটি যথেষ্ট গণনা করা হয়েছে। (আমি সন্দেহ করি যে তারা আজকে এটি বদলে দিতে পারলে জাহান্নামই হত!) এর বাইরে আমি কখনও বিশেষ যুক্তি দেখিনি।


6
সম্ভাব্য যৌক্তিকতা: সি কেবলমাত্র এটি করেছে কারণ অ্যারেটি মূলত কেবলমাত্র একটি পয়েন্টার এবং array[0] == array + 0;এবং অ্যারেটি সত্যই হ্যাশ টেবিল হলে 1-ভিত্তিক গণনা আরও স্বাভাবিক হয়।
বিচারক মেইগার্ডেন

19
লুয়া সূচকগুলি আসলে সূচকগুলি। সি-তে যখন আপনি সূচকটি বলেন তখন আপনার সত্যিকারের অর্থ যা অফসেট।
অ্যালেক্স

8

সম্ভবত একটি কম তাৎপর্যপূর্ণ পয়েন্ট, তবে একটি যা আমি এখনও উল্লেখ করি নি: এটিতে আরও ভাল প্রতিসাম্য রয়েছে যে স্ট্রিংয়ের প্রথম এবং শেষ অক্ষরগুলি 0 এবং -1 এর পরিবর্তে যথাক্রমে 1 এবং -1 এ থাকে।


8
যদিও এটি দুর্দান্ত, এটি 1. থেকে শুরু করার কারণ ছিল না
lhf

3

লুয়া গ্রন্থাগারগুলি সূচকগুলি শুরু করতে পছন্দ করে যা শুরু হয় ১. তবে, আপনি যে কোনও সূচক ব্যবহার করতে পারেন। আপনি 0 ব্যবহার করতে পারেন, আপনি 1 ব্যবহার করতে পারেন, আপনি -5 ব্যবহার করতে পারেন। এটি তাদের ম্যানুয়ালটিতেও রয়েছে, যা ( https://www.lua.org/pil/11.1.html ) এ পাওয়া যাবে ।

প্রকৃতপক্ষে, এখানে শীতল কিছু হ'ল অভ্যন্তরীণ লুয়া গ্রন্থাগারগুলি কিছুটা 0 কে পাসের মান হিসাবে বিবেচনা করবে। আইপায়েরগুলি ব্যবহার করার সময় কেবল সতর্কতা অবলম্বন করুন।
যাতে: ("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'? এটি আমার কাছে অন্তর্নির্মিত বলে মনে হচ্ছে।
রেমরম


0

আসল কারণটি হ'ল ভাষাটি পর্তুগালের একটি আইনে সংজ্ঞাটির বাস্তবায়ন এবং প্রধান বিকাশ কেন্দ্রটি ব্রাজিলে ছিল এবং তাদের পছন্দ হ'ল শূন্য বা খালি বা কোনও কিছুই সূচি বা সাবস্ক্রিপ্ট হিসাবে ব্যবহার এড়ানো নয়। তবে ভাষাটি কিছু সংস্করণে ফাংশন তৈরির টেবিলটিতে 1 ব্যতীত আরম্ভ সূচক ব্যবহারের অনুমতি দেয় না।


5
এমনকি যদি এটি সত্য হয় তবে লুয়া কীভাবে ডিজাইন করা হয়েছিল তার সাথে এটি মোটেই প্রাসঙ্গিক নয়।
lhf

-1

টেবিল [0] সর্বদা ফিরে আসবে শূন্য (নাল), আপনি নিজের মান নির্ধারণ না করে নিজের টেবিল [0] = 'কিছু মান' এবং তারপরে টেবিল [0] আপনি নির্ধারিত 'কিছু মান' ফিরিয়ে দেবে।

এখানে একটি উদাহরণ:

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] এটি বিদ্যমান, এবং এটির টেবিল = {}, যা এটি খালি, এখন কোনও প্রোগ্রামার একটি খালি টেবিল কল করবে না, এটি সেট করে এবং তারপরে এটি পূরণ করে, খালি খুঁজে পাওয়া ব্যর্থ হবে আপনি যখনই কল করতে চান ততবার টেবিল, যাতে খালি টেবিলটি তৈরি করা সহজ।

আমার ইংরেজি আরও ভাল হবে না এবং এটি আমার সেরা ব্যাকরণ। আপনি যদি এটি পছন্দ না করেন তবে আপনার এটি পড়তে না পারার জন্য নিখরচায়, তবে কাউকে সাহায্য করার চেষ্টা করার জন্য -রেপ দেওয়া লোকেদের আদৌ সহায়তা করতে চায় না, বিশেষত ব্যাকরণের মতো কোনও কিছুর জন্য। আমি ব্যাকরণ নয়, সংখ্যা ও ভারসের মানুষ। দুঃখিত।


4
আমি একটি টেবিলের মূল্যবান 0 হওয়ার ধারণাটি পাই না। একটি টেবিলটির দৈর্ঘ্য 0 থাকতে পারে তবে এটি প্রথম সূচকের পছন্দ থেকে পৃথক। আমি ব্যাকরণের ছোটখাটো ভুল সম্পর্কে চিন্তা করি না, তবে আমি আপনার উত্তরটির বিন্দুটি বুঝতে পারি না, এজন্যই আমি হ্রাস পেয়েছি।
কোডসইনচাউস

আমি কী জানি না, একটি টেবিলটি 0 টি সূচক বা মান সহ ধারণ করতে পারে না, যেহেতু আমরা এটি খালি টেবিল হিসাবে ব্যবহার করি <, <যখন আপনার কাছে এমন কিছু থাকে যা এটি 1 থেকে প্রতিনিধিত্ব করে, "n" তাই আপনার কিছু না থাকলে আপনার খালি কিছু, যা আমাদের একটি সেরো দিকে নিয়ে যায়, কিন্তু সেরো ডোন্ট গণনা, এটি ব্যবহারিক আসে এমন একটি ভাষাগুলি, আপনি বাইরে যান না এবং আপনার বন্ধুদের জানাতে পারেন না যে আমার কাছে সেই শিল্পীদের কী গান আছে, আইগারের আপনার কিছু আছে, বা আপনি না। বিন্দুটির এর টেবিলটি =}} একটি খালি টেবিলের সারণি
ওয়েস্টার

5
সূচিটি 0কেবলমাত্র উপাদান হিসাবে ব্যবহার করে এমন একটি অ্যারে এখনও খালি নেই। আসলে লুয়া এটি সমর্থন করে, এটি কেবলমাত্র ডিফল্ট কনভেনশন নয়।
কোডসইনচওস

হ্যাঁ, আমি আপনার সাথে কয়েকটি অন্যান্য ভাষায় একমত, তবে লুয়া নয়, লুয়া সূচক 0 ডসেন্ট বিদ্যমান, তাই আমরা এটি খালি = 0 এর মতো করে কল্পনা করতে পারি, বা আমি কীভাবে চিত্র এটি চিত্রিত করি, এমনকি আপনি যখন সূচককে 0 হতে বাধ্য করতে পারেন, এটি টেবিলের মানগুলির সাথে কাজ করবে না # টেবিলটি 0 টি সূচকটি পড়তে পারে, তবে আমার উত্তরটি এখনও তার উত্তর দেয় যে লুয়া এটির প্রাথমিকভাবে একটি নিয়মিত ইভেন্টের মতো তৈরি হয়েছে, এখন যদি তারা এটির উদ্দেশ্য করে থাকে বা না হয় যদি এটি সত্যিই প্রাসঙ্গিক না হয় তবে আপনি আবার গর্ত কোডটি লিখবেন না, এবং আমরা এটি সম্পর্কে কিছু করতে পারি না: /, আমি এখনও বিশ্বাস করি যে এটি বলা ভাল যে লুয়াতে একটি খালি টেবিলের 0 টি সূচক রয়েছে
ওয়েস্টার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.