الطريقة الأكثر كفاءة لتحديد ما إذا كان جدول LUA فارغا (لا يحتوي على أي إدخالات)؟

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

  •  12-09-2019
  •  | 
  •  

سؤال

ما هي الطريقة الأكثر كفاءة لتحديد ما إذا كان الجدول فارغا (أي أنه يحتوي حاليا على قيم نمط الصفيف أو قيم نمط DICT)؟

حاليا، أنا أستخدم next():

if not next(myTable) then
    -- Table is empty
end

هل هناك طريقة أكثر كفاءة؟

لاحظ ال # لا يكفي المشغل هنا، لأنه يعمل فقط على قيم نمط الصفيف في الجدول - وبالتالي #{test=2} لا يمكن تمييزه عن ذلك #{} لأن كلا العائدين 0. لاحظ أيضا أن التحقق مما إذا كان متغير الجدول هو nil لا يكفي لأنني لا أبحث عن قيم nil، ولكن الجداول بدلا من 0 إدخالات (أي {}).

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

المحلول

الكود الخاص بك هو فعال ولكنه خطأ. (انصح {[false]=0}.) الكود الصحيح هو

if next(myTable) == nil then
   -- myTable is empty
end

للحصول على أقصى قدر من الكفاءة التي تريد ربطها next إلى متغير محلي، على سبيل المثال،

...
local next = next 
...
... if next(...) ...

نصائح أخرى

يمكن أن يكون أحد الاحتمالات حساب عدد العناصر، باستخدام مفتاح "Newindex" الموسيء. عند تعيين شيء لا nil, ، زيادة العداد (يمكن أن يعيش العداد في مملوءه كذلك) وعندما يعين nil, ، وتناقص العداد.

سيكون اختبار الجدول الفارغ هو اختبار العداد مع 0.

هنا مؤشر ل الوثائق الموسعة

أنا أحب الحل الخاص بك رغم ذلك، وأنا بصراحة لا أستطيع أن أفترض أن الحل الخاص بي أسرع بشكل عام.

ربما هذا هو ما تريد:

function table.empty (self)
    for _, _ in pairs(self) do
        return false
    end
    return true
end

a = { }
print(table.empty(a))
a["hi"] = 2
print(table.empty(a))
a["hi"] = nil
print(table.empty(a))

انتاج:

true
false
true

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

yourtablename = {} -- this seems to work for me when I need to clear a table.

من الأفضل تجنب تقييم __eq إذا مثقلا.

if rawequal(next(myTable), nil) then
   -- myTable is empty
end

أو

if type(next(myTable)) == "nil" then
   -- myTable is empty
end

حاول الثعبان، العمل بالنسبة لي

serpent = require 'serpent'

function vtext(value)
  return serpent.block(value, {comment=false})
end

myTable = {}

if type(myTable) == 'table' and vtext(myTable) == '{}' then
   -- myTable is empty
end

وماذا عن هذا ؟

if endmyTable[1] == nil then
  -- myTable is empty
end

جرب استخدام #. وبعد إرجاع كل الحالات الموجودة في جدول. إذا لم يكن هناك حالات في جدول، فستظهر 0

if #myTable==0 then
print('There is no instance in this table')
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top