كيف يمكنني الحصول على عدد من المفاتيح في جدول تجزئة في لوا?

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

  •  19-08-2019
  •  | 
  •  

سؤال

myTable = {}
myTable["foo"] = 12
myTable["bar"] = "blah"
print(#myTable) -- this prints 0

هل أنا فعلا للتنقل خلال العناصر الموجودة في الجدول على عدد من المفاتيح ؟

numItems = 0
for k,v in pairs(myTable) do
    numItems = numItems + 1
end
print(numItems) -- this prints 2
هل كانت مفيدة؟

المحلول

وأنا جربت مع كل من المشغل و# table.getn (). اعتقدت table.getn () أن تفعل ما تريد ولكن كما اتضح انها تعود لنفس قيمة #، وهي 0. يبدو أن القواميس إدراج شيء النائبة حسب الضرورة.

وحلقات على مفاتيح واعدهم يبدو أن الطريقة الوحيدة للحصول على حجم القاموس.

نصائح أخرى

المشغل طول:

<اقتباس فقرة>   

ويتم تعريف طول ر الجدول أن هناك أي مؤشر عدد صحيح ن بحيث ر [ن] ليست معدومة وتي [ن + 1] هو لا شيء. علاوة على ذلك، إذا ر [1] هو لا شيء، ن يمكن أن يكون صفرا. لمجموعة منتظمة، مع القيم غير صفر من 1 إلى ن معينة، طوله بالضبط ن، ومؤشر القيمة الأخيرة. إذا كان الصفيف "الثقوب" (أي، لا شيء القيم بين القيم غير شيء الأخرى)، ثم #T يمكن أن يكون أي من المؤشرات التي تسبق مباشرة قيمة معدومة (وهذا يعني أنه قد تنظر في أي من هذه القيمة معدومة كنهاية المصفوفة).

وأعاد

والطريق حتى الوحيدة للحصول على طول أكثر من ذلك.

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

function CountedTable(x)
  assert(type(x) == 'table', 'bad parameter #1: must be table')

  local mt = {}
  -- `keys`  will represent the number of non integral indexes
  -- `indxs` will represent the number of integral indexes
  -- `all`   will represent the number of both 
  local keys, indxs, all = 0, 0, 0

  -- Do an initial count of current assets in table. 
  for k, v in pairs(x) do
    if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1
    else keys = keys + 1 end

    all = all + 1
  end

  -- By using `__nexindex`, any time a new key is added, it will automatically be
  -- tracked.
  mt.__newindex = function(t, k, v)
    if (type(k) == 'number') and (k == math.floor(k)) then indxs = indxs + 1
    else keys = keys + 1 end

    all = all + 1
    t[k] = v
  end

  -- This allows us to have fields to access these datacounts, but won't count as
  -- actual keys or indexes.
  mt.__index = function(t, k)
    if k == 'keyCount' then return keys 
    elseif k == 'indexCount' then return indxs 
    elseif k == 'totalCount' then return all end
  end

  return setmetatable(x, mt)
end

وأمثلة على استخدام هذه ما يلي:

-- Note `36.35433` would NOT be counted as an integral index.
local foo = CountedTable { 1, 2, 3, 4, [36.35433] = 36.35433, [54] = 54 }
local bar = CountedTable { x = 23, y = 43, z = 334, [true] = true }
local foobar = CountedTable { 1, 2, 3, x = 'x', [true] = true, [64] = 64 }

print(foo.indexCount)    --> 5
print(bar.keyCount)      --> 4
print(foobar.totalCount) --> 6

<م> مباشر العمل مثال

وهذا الأمل ساعد! :)

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

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