কোনও লুয়া টেবিলটি ফাঁকা আছে কিনা তা নির্ধারণের সর্বাধিক দক্ষ উপায় (এতে কোনও প্রবেশিকা নেই)?


120

কোনও সারণিটি খালি কিনা তা নির্ধারণের সবচেয়ে কার্যকর উপায়টি (এটি বর্তমানে অ্যারে-স্টাইলের মান বা ডিক স্টাইলের মানগুলি ধারণ করে না)?

বর্তমানে, আমি ব্যবহার করছি next():

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

আরও কার্যকর উপায় আছে?

দ্রষ্টব্য: #অপারেটরটি এখানে পর্যাপ্ত পরিমাণে আসে না, কারণ এটি কেবল সারণীতে অ্যারে-স্টাইলের মানগুলিতে কাজ করে - এইভাবে উভয়ই প্রত্যাবর্তন করে #{test=2}isting থেকে আলাদা করা যায় না #{}Also এছাড়াও নোট করুন যে টেবিলের পরিবর্তনশীল nilযথেষ্ট কিনা তা আমি খুঁজেছি না তা পরীক্ষা করে নেওয়াও শূন্য মানগুলি নয়, তবে 0 টি প্রবেশ (যেমন {}) সহ টেবিলগুলি table

উত্তর:


151

আপনার কোড দক্ষ তবে ভুল। (বিবেচনা করুন {[false]=0}।) সঠিক কোডটি

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

সর্বাধিক দক্ষতার জন্য আপনি nextএকটি স্থানীয় ভেরিয়েবলের সাথে বাঁধতে চান , যেমন,

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

1
প্রযুক্তিগত নির্ভুলতার জন্য ভাল পয়েন্ট; বিশেষ ক্ষেত্রে আমি মূল কোডটি ব্যবহার করছি, falseএকটি প্রত্যাশিত কী হবে না তাই কাজটি if notভাল হয়েছে, তবে আমি সম্ভবত nilভবিষ্যতের পরিবর্তে তুলনামূলক অভ্যাস করব , ঠিক একটি ভাল অভ্যাস হিসাবে। এবং হ্যাঁ, আমি সাধারণ ইউটিলিটি ফাংশনগুলিকে গতির জন্য স্থানীয় যুদ্ধগুলিতে আবদ্ধ করছি। যদিও ইনপুট জন্য ধন্যবাদ।
অ্যাম্বার

1
কোডটি যখন ইচ্ছা মত কাজ করে তখন অন্যায় সাথে একমত হওয়া আমার পক্ষে কঠিন মনে হয়
আরডি অ্যালকায়ার

4
কেন আমরা গতি অর্জন করে local next?
মোবার্গ

2
@ মোবার্গ এটি কীভাবে এলইউএর নামস্থানটি পরিচালনা করে to খুব নীচের সংস্করণটি হ'ল এটি কি প্রথম স্থানীয় টেবিলগুলি উপরে উঠবে, সুতরাং local nextবর্তমান ব্লকে যদি কোনও উপস্থিত থাকে , এটি এটি ব্যবহার করবে, তারপরে পরবর্তী ব্লকে উঠে যাবে এবং পুনরাবৃত্তি করবে। স্থানীয়দের বাইরে গেলে, এটি তখনই গ্লোবাল নেমস্পেস ব্যবহার করবে। এটি এর মূ down় সংস্করণ, তবে শেষ পর্যন্ত এটি অবশ্যই প্রোগ্রামের গতির ক্ষেত্রে পার্থক্য বোঝায়।
এটাকো

৫.২ এবং ৫.৩ লুয়া প্রসঙ্গে, মোবার্গের কম ডম্বা ডাউন সংস্করণটি হ'ল অ স্থানীয় লোকেরা হয় উর্ধ্বতন বা _ইএনভি লুকআপ। একটি আপলিকে ইন্ডিয়ারেশনের অতিরিক্ত স্তরের মধ্য দিয়ে যেতে হয়, অন্যদিকে _ENV অনুসন্ধানটি একটি সারণী অনুসন্ধান। যেখানে কোনও স্থানীয় ভিএম
ডেমুর রুমেমে

1

মেটাটেবল "নিউইন্ডেক্স" কী ব্যবহার করে উপাদানের সংখ্যা গণনা করার একটি সম্ভাবনা থাকবে। কিছু না দেওয়ার সময় nil, কাউন্টারকে বাড়িয়ে দিন (কাউন্টারটি মেটাটেবলেও থাকতে পারে) এবং যখন বরাদ্দ করা হয় তখন nilকাউন্টারটি হ্রাস করুন।

খালি টেবিলের জন্য পরীক্ষাটি 0 দিয়ে কাউন্টারটি পরীক্ষা করা হবে।

মেটাটেবল ডকুমেন্টেশনের পয়েন্টার এখানে

আমি যদিও আপনার সমাধানটি পছন্দ করি এবং আমি সত্যই ধরে নিতে পারি না যে আমার সমাধানটি সামগ্রিকভাবে দ্রুত।


5
মূল প্রশ্নটি কেবল "অ্যারে" এন্ট্রি গণনা নিয়ে নয়।
lhf

3
0x6 এর পরামর্শ অ্যারে-স্টাইল এন্ট্রিগুলির সাথে সুনির্দিষ্ট নয় (নিউইন্ডেক্স সূচকগুলি এবং সংখ্যাসূচক উভয় সূচকের জন্য কাজ করে)। তবে, nilনির্ধারিত হওয়ার সময় মূল বিষয়টি শনাক্ত করা হবে , যেহেতু টেবিলে কীটি ইতিমধ্যে বিদ্যমান থাকলে wnewindex ট্রিগার না করে।
অ্যাম্বার

3
কাজ করার জন্য এই কৌতুক জন্য, metatable উভয় বাস্তবায়ন করতে হবে __indexএবং __newindex, একটি ছায়া টেবিলে প্রকৃত তথ্য সংরক্ষণ এবং রিয়েল টেবিল তাই খালি যে পালন __indexএ সব প্রার্থনা করা হবে না। উচ্চস্বরে চিন্তা করে, আমি সন্দেহ করি যে প্রতিটি একক দেখার জন্য উত্থাপিত ব্যয়টি উপযুক্ত হতে পারে না।
RBerteig

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

11
next()লুপিংয়ের চেয়ে আরও দক্ষ (এবং আরও সংক্ষিপ্ত) pairs()
আম্বর

8
বস্তুত, উপর লুপিং pairs() হয় মূলত মাত্র ব্যবহার next()কৌশল, কিন্তু আরও ওভারহেড সঙ্গে।
সন্দেহভাজন

7
এছাড়াও, স্ট্যান্ডার্ড tableলাইব্রেরিতে লেখার পরামর্শ দেওয়া হয় না।
তি স্টারগা

-1

ওভারলোড হলে __eq এর মূল্যায়ন এড়াতে আরও ভাল।

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

অথবা

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

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

-1

সর্প চেষ্টা, আমার জন্য কাজ

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


-3

আমি জানি এটি পুরানো, এবং আমি আপনাকে কোনওভাবে ভুল বোঝাবুঝি করতে পারি, তবে এটি আপনি কেবল টেবিলটি খালি রাখতে চান, এটি যদি না আপনি কেবল এটি পরীক্ষা করে না থাকেন এবং আপনি আসলে এটি খালি রাখতে চান না বা চান না, আমি ভুল না হলে আপনি কেবল এটিকে পুনরায় তৈরি করে সাফ করতে পারেন। এটি নীচের বাক্য গঠন সহ করা যেতে পারে।

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

4
এটাই প্রশ্ন নয়।
ইউ হাও

-6

ব্যবহার করার চেষ্টা করুন #। এটি টেবিলে থাকা সমস্ত দৃষ্টান্ত ফেরত দেয়। যদি কোনও টেবিলে উদাহরণ না থাকে তবে তা ফিরে আসে0

if #myTable==0 then
print('There is no instance in this table')
end

1
প্রশ্নকর্তা বলেছেন যে #এখানে যথেষ্ট হবে না, এবং এর কারণ দেয়; কেন আপনি ব্যাখ্যা করতে পারেন যে এই কারণগুলির কাছাকাছি কেন?
2'17

ভাল ... আমি না know.I এই নতুন am কি তাই একমাত্র উপায় আমি জানি # ব্যবহার করছে
arthurgps2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.