Apa cara paling efisien untuk menentukan apakah sebuah tabel kosong (yaitu, saat ini tidak berisi nilai gaya array maupun nilai gaya dikt)?
Saat ini, saya menggunakan next()
:
if not next(myTable) then
-- Table is empty
end
Apakah ada cara yang lebih efisien?
Catatan: #
Operator tidak mencukupi di sini, karena hanya beroperasi pada nilai gaya array dalam tabel - sehingga #{test=2}
tidak dapat dibedakan dari #{}
karena keduanya menghasilkan 0. Perhatikan juga bahwa memeriksa apakah variabel tabel nil
tidak mencukupi karena saya tidak mencari nil, tetapi tabel dengan 0 entri (yaitu {}
).
false
tidak akan menjadi kunci yang diharapkan sehinggaif not
berfungsi dengan baik, tetapi saya mungkin akan membuat kebiasaan untuk membandingkannyanil
di masa depan, sama seperti kebiasaan yang baik. Dan ya, saya telah mengikat fungsi utilitas umum ke vars lokal untuk kecepatan. Terima kasih atas masukannya.local next
?local next
di blok saat ini, ia akan menggunakannya, lalu naik ke blok berikutnya, dan ulangi. Setelah keluar dari penduduk setempat, itu hanya akan menggunakan Global Namespace. Ini adalah versi bodohnya, tetapi pada akhirnya, itu berarti perbedaan dalam hal kecepatan program.Salah satu kemungkinannya adalah menghitung jumlah elemen, dengan menggunakan kunci "indeks baru" yang dapat diukur. Saat menugaskan sesuatu yang tidak
nil
, tambah penghitung (penghitung juga bisa hidup di metatabel) dan saat menetapkannil
, kurangi penghitung.Pengujian untuk tabel kosong akan menguji penghitung dengan 0.
Berikut adalah penunjuk ke dokumentasi yang dapat diukur
Saya menyukai solusi Anda, dan sejujurnya saya tidak dapat berasumsi bahwa solusi saya lebih cepat secara keseluruhan.
sumber
nil
ditetapkan, karena __newindex tidak memicu jika kunci sudah ada di tabel.__index
dan__newindex
, menyimpan data aktual dalam tabel bayangan dan mengosongkan tabel nyata sehingga__index
akan dipanggil sama sekali. Berpikir keras, saya curiga bahwa biaya yang meningkat dari setiap pencarian tidak sepadan.Ini mungkin yang Anda inginkan:
Keluaran:
sumber
next()
lebih efisien (dan lebih ringkas) daripada mengulangpairs()
.pairs()
adalah dasarnya hanya menggunakannext()
teknik, tetapi dengan lebih banyak overhead.table
tidak disarankan untuk menulis ke pustaka standar .lebih baik hindari evaluasi __eq jika kelebihan beban.
atau
sumber
coba ular, bekerjalah untukku
sumber
Bagaimana dengan ini ?
sumber
Saya tahu ini sudah tua, dan saya bisa saja salah paham, tetapi Anda hanya ingin meja kosong, kecuali Anda hanya memeriksa apakah itu benar dan Anda tidak benar-benar ingin atau membutuhkannya kosong, Anda dapat menghapusnya hanya dengan membuatnya kembali, kecuali saya salah. ini dapat dilakukan dengan sintaks di bawah ini.
sumber
Coba gunakan
#
. Ini mengembalikan semua contoh yang ada dalam tabel. Jika tidak ada contoh dalam tabel, maka itu kembali0
sumber
#
tidak cukup di sini, dan memberikan alasan mengapa; dapatkah Anda menjelaskan mengapa hal ini menyinggung alasan tersebut?