كيف يمكنني الحصول على عدد من المفاتيح في جدول تجزئة في لوا?
سؤال
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
وهذا الأمل ساعد! :)
لوا مخازن الجدول اثنين يفصل أجزاء :تجزئة جزء ومجموعة جزء لين المشغل تتعامل فقط مع مجموعة جزء معنى قيمة فهرستها من قبل عدد القيمة ، بالإضافة إلى استخدام القواعد المذكورة أدناه ، لذلك لم يكن لديك أي خيار عد "تجزئة" قيمة تحتاج إلى تكرار عبر طاولة المفاوضات مع أزواج() وظيفة.