Kedengarannya seperti pertanyaan "biarkan saya google untuk Anda", tetapi entah bagaimana saya tidak dapat menemukan jawaban. #
Operator Lua hanya menghitung entri dengan kunci integer, dan begitu juga table.getn
:
tbl = {}
tbl["test"] = 47
tbl[1] = 48
print(#tbl, table.getn(tbl)) -- prints "1 1"
count = 0
for _ in pairs(tbl) do count = count + 1 end
print(count) -- prints "2"
Bagaimana cara saya mendapatkan jumlah semua entri tanpa menghitungnya?
dictionary[value] = #dictionary + 1
, di mana#
merepresentasikan jumlah semua objek. Yang saya heran adalah mengapa Anda tidak menginginkan ini: dalam semua kasus penggunaan # untuk waras (lihat jawaban oleh kaizer.se), jumlah semua objek persis sama dengan apa yang sudah # dikembalikan; sepertinya membuat # hitung semuanya benar-benar perbaikan. Tentu saja saya seorang pemula Lua dan mungkin kehilangan intinya.#
operator hanya tidak jelas. Ini sangat mudah diperbaiki: pertama, buat#
deterministik, dan kedua, kenalkan operator atau fungsi baru untuk mendapatkan jumlah yang sangat berarti. Akhir cerita ... Mengapa mereka harus begitu keras kepala? :)Jawaban:
Anda sudah memiliki solusi dalam pertanyaan - satu-satunya cara adalah dengan mengulangi seluruh tabel
pairs(..)
.Juga, perhatikan bahwa definisi operator "#" sedikit lebih rumit dari itu. Izinkan saya menggambarkannya dengan mengambil tabel ini:
Menurut manual, salah satu dari 3, 5 dan 9 adalah hasil yang valid untuk
#t
. Satu-satunya cara yang waras untuk menggunakannya adalah dengan array dari satu bagian yang berdekatan tanpa nilai nil.sumber
#
tidak deterministik.According to the manual, any of 3, 5 and 9 are valid results for #t
. Menurut manual, memanggil # pada non-urutan tidak ditentukan . Itu berarti bahwa hasil apa pun (-1, 3, 3.14, 5, 9) valid.Anda dapat mengatur tabel meta untuk melacak jumlah entri, ini mungkin lebih cepat daripada iterasi jika informasi ini sering dibutuhkan.
sumber
Ada satu cara, tetapi mungkin mengecewakan: gunakan variabel tambahan (atau salah satu bidang tabel) untuk menyimpan hitungan, dan tambah setiap kali Anda membuat penyisipan.
Tidak ada cara lain, operator # hanya akan bekerja pada tabel seperti array dengan tombol berurutan.
sumber
Cara termudah yang saya tahu untuk mendapatkan jumlah entri dalam tabel adalah dengan '#'. #tableName mendapatkan jumlah entri selama mereka diberi nomor:
Sayangnya, jika mereka tidak diberi nomor, itu tidak akan berhasil.
sumber
Anda dapat menggunakan perpustakaan penalight . Ini memiliki fungsi
size
yang memberikan ukuran sebenarnya dari tabel.Ini telah mengimplementasikan banyak fungsi yang mungkin kita perlukan saat pemrograman dan hilang di Lua.
Ini adalah contoh untuk menggunakannya.
sumber
sumber
__newindex
hanya menelepon saat kunci baru__newindex
ditentukan , jadi tidak ada kesempatan untuk menelepon saat kami menyetelnil
ke kunci yang ada.tampaknya ketika elemen tabel ditambahkan dengan metode insert, getn akan kembali dengan benar. Kalau tidak, kita harus menghitung semua elemen
Ini akan mencetak 2 dengan benar
sumber