لماذا تبدأ صفائف Lua (الجداول) من 1 بدلاً من 0؟

StackOverflow https://stackoverflow.com/questions/2785704

  •  03-10-2019
  •  | 
  •  

سؤال

لا أفهم الأساس المنطقي وراء قرار هذا الجزء من لوا. لماذا تبدأ الفهرسة في 1؟ لقد قرأت (كما فعل العديد من الآخرين) هذه الورقة العظيمة. يبدو لي زاوية غريبة من لغة ممتعة للغاية للتعلم والبرنامج. لا تفهموني خطأ ، لوا رائع ، لكن يجب أن يكون هناك تفسير في مكان ما. معظم ما وجدته (على الويب) هو مجرد قول أن الفهرس يبدأ من 1. توقف كامل.

سيكون من المثير للاهتمام قراءة ما قاله مصمموها حول هذا الموضوع.

لاحظ أنني مبتدئ في لوا ، آمل ألا أفتقد شيئًا واضحًا عن الجداول.

هل كانت مفيدة؟

المحلول

ينحدر لوا من SOL ، وهي لغة مصممة لمهندسي البترول مع عدم وجود تدريب رسمي في برمجة الكمبيوتر. يعتقد الأشخاص الذين لم يتدربوا على الحوسبة أنه من الغريب أن يبدأوا في العد عند الصفر. من خلال تبني صفيف واحد على أساس واحد وفهرسة السلسلة ، تجنب مصممو LUA الخلط بين توقعات عملائهم والجهات الراعية الأولى.

على الرغم من أنني وجدتهم غريبًا أيضًا في البداية ، فقد تعلمت أن أحب المصفوفات القائمة على 0. لكنني أحصل على موافق مع المصفوفات المستندة إلى Lua ، خاصةً باستخدام Lua's Generic for حلقة و ipairs المشغل - يمكنني عادة تجنب القلق بشأن كيفية فهرسة المصفوفات.

نصائح أخرى

في البرمجة في لواأول مناقشة الجداول ، يذكرون:

نظرًا لأنه يمكنك فهرسة جدول بأي قيمة ، يمكنك بدء تشغيل مؤشرات صفيف مع أي رقم يرضيك. ومع ذلك ، فمن المعتاد في لوا أن تبدأ المصفوفات مع 1 (وليس مع 0 ، كما في C) والعديد من المرافق التمسك بهذه الاتفاقية.

في وقت لاحق ، في الفصل الخاص بهياكل البيانات ، يقولون نفس الشيء تقريبًا مرة أخرى: أن المرافق المدمجة في لوا تفترض فهرسة واحدة.

على أي حال ، هناك ملف زوج وسائل الراحة لاستخدام الفهرسة 1. و هي # (طول) المشغل: t[#t] الوصول إلى الفهرس الأخير (الرقمي) للجدول ، و t[#t+1] الوصول 1 ماضي الفهرس الأخير. إلى شخص لم يتعرض بالفعل لفهرسة قائم على 0 ، #t+1 سيكون أكثر سهولة للتغلب على نهاية القائمة. هناك أيضا لوا for i = 1,#t بنية ، والتي أعتقد أنها تندرج تحت نفس الفئة مثل النقطة السابقة المتمثلة في أن "1 إلى الطول" يمكن أن يكون أكثر عقلانية من فهرسة "0 إلى الطول ناقص 1".

ولكن ، إذا لم تتمكن من كسر عقلية الفهرسة المستندة إلى 0 ، فإن الفهرسة المستندة إلى Lua 1 يمكن أن تكون بالتأكيد عائقًا. في النهاية ، أراد المؤلفون شيئًا يعمل من أجله هم; ؛ وسأعترف أنني لا أعرف ماذا أصلي كان الهدف ، ولكن ربما تم تغييره منذ ذلك الحين.

هناك سبب واحد مهم للغاية لعدم حساب المصفوفات من 1: إذا بدأت المصفوفات من الصفر ، فيمكنك استخدامها كحلقات جبرية بطريقة طبيعية. على سبيل المثال ، لدينا أيام الأسبوع (day={'mo', 'tu', 'we'...) ونريد أن ننقل من خلالهم. ثم سيكون من المذهل أن تكتب:

nextday = day[(i+1)%7]  as it is in almost every other language

من:

nextday = day[i%7+1] as it is in lua

لا يبدو أن هذا سيئ في البداية ، ولكن حاول ركوب الأسبوع في الاتجاه الآخر.

أو بشكل عام: إذا كانت مجموعة الفهرس تفتقر إلى الصفر ، فإنها تفتقر إلى العنصر المحايد للإضافة. كلما كانت هناك حاجة في حسابات الفهرس ، يجب تغيير المؤشرات.

أنا رياضيات ، لكنني قبلت حقيقة أنه عندما يتعلق الأمر بالبرمجة ، فإن العد من الصفر هو مجرد خيار أفضل ..

ما أفهمه هو أن الأمر بهذه الطريقة لمجرد أن المؤلفين اعتقدوا أنه سيكون طريقة جيدة للقيام بذلك ، وبعد أن قاموا بتدوير اللغة إلى الجمهور ، يتكلم القرار بشكل كبير. (أظن أنه سيكون هناك جحيم للدفع لو كان عليهم تغييره اليوم!) لم أر أبداً مبررًا خاصًا بما يتجاوز ذلك.

ربما كانت نقطة أقل أهمية ، لكن لم أسمعها بعد: هناك تناسق أفضل في حقيقة أن الشخصيات الأولى والأخيرة في سلسلة في 1 و -1 على التوالي ، بدلاً من 0 و -1.

سيعود الجدول [0] دائمًا إلى NIL (NULL) ، إلا إذا قمت بتعيين قيمة له بنفسك [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]))

تفضل مكتبات LUA استخدام المؤشرات التي تبدأ من 1. ومع ذلك ، يمكنك استخدام أي فهرس تريده. يمكنك استخدام 0 ، يمكنك استخدام 1 ، يمكنك استخدام -5. حتى في دليلهم ، والذي يمكن العثور عليه في (https://www.lua.org/pil/11.1.html).

في الواقع ، هناك شيء رائع هنا هو أن مكتبات LUA الداخلية سوف تعامل بعضها على 0 كـ 1. فقط كن حذرًا عند استخدام ipairs.
بحيث: ("ABC"): Sub (0،1) == "A" و ("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

والسبب الحقيقي هو أن اللغة هي تنفيذ التعريف في قانون البرتغال وكان مركز التطوير الرئيسي في البرازيل وتفضيلها هو تجنب استخدام الصفر أو فارغ أو لا شيء كمؤشر أو ترجمي. ومع ذلك ، فإن اللغة تسمح باستخدام فهرس البدء بخلاف 1 في جدول إنشاء وظيفة في بعض الإصدارات.

من المنطقي لكل واحد ، أنه إذا أ

table = {}

في اللحظة، table فارغ. اذن متى

table == {something}

يحتوي الجدول على شيء ما ، لذا فإن ما يحتوي عليه هو الفهرس 1 في table إن فهمت ما أقصده.

ما قصدته هذا الجدول [0] موجود ، وجدوله = {} ، وهو فارغ ، الآن لم يتصل مبرمج بجدول فارغ ، ويقوم بتعيينه ، ثم يملأه ، سيكون من غير المجدي العثور على فارغة الجدول في كل مرة تريد أن تسميها ، لذلك من الأسهل إنشاء جدول فارغ.

لن تتحسن لغتي الإنجليزية وهذا أفضل قواعد. إذا كنت لا تحب ذلك ، فأنت حر في عدم الاستمرار في قراءته ، ولكن إعطاء -rep لشخص يحاول المساعدة يجعل الناس لا يرغبون في المساعدة على الإطلاق ، خاصة بالنسبة لشيء مثل القواعد. أنا رجل من الأرقام والموظفين ، وليس القواعد. آسف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top