Saya bingung tentang perbedaan antara panggilan fungsi via .
dan via:
> x = {foo = function(a,b) return a end, bar = function(a,b) return b end, }
> return x.foo(3,4)
3
> return x.bar(3,4)
4
> return x:foo(3,4)
table: 0x10a120
> return x:bar(3,4)
3
Apa yang sedang :
dilakukan?
Jawaban:
Usus besar untuk menerapkan metode yang lulus
self
sebagai parameter pertama. Jadix:bar(3,4)
harus sama denganx.bar(x,3,4)
.sumber
self
objek akan pergi sebagai parameter pertama dan nilai propertinya.object.method(object,args)
mengambilobject
dua kali, sedangkan hanyaobject:method(arg)
mengambilobject
sekali. Jikaobject
adalah bidang global, peningkatan nilai atau tabel, maka:
lebih cepat dari.
..
tidak pernah lebih cepat dari:
.Untuk definisi itu persis sama dengan menentukan sendiri secara manual - itu bahkan akan menghasilkan bytecode yang sama pada kompilasi. Yaitu
function object:method(arg1, arg2)
sama denganfunction object.method(object, arg1, arg2)
.Penggunaan
:
adalah hampir sama dengan.
- jenis khusus dari panggilan akan digunakan secara internal untuk memastikanobject
dan setiap kemungkinan efek samping dari perhitungan / akses dihitung hanya sekali. Panggilannyaobject:method(arg1, arg2)
sama denganobject.method(object, arg1, arg2)
.sumber
Untuk sepenuhnya tepat,
obj:method(1, 2, 3)
sama denganMengapa variabel lokal? Karena, seperti yang telah ditunjukkan banyak orang,
obj:method()
hanya indeks yang_ENV
mendapatkan sekaliobj
. Ini biasanya hanya penting ketika mempertimbangkan kecepatan, tetapi pertimbangkan situasi ini:Sekarang bayangkan
__index
metametode melakukan lebih dari sekedar mencetak sesuatu. Bayangkan itu meningkatkan penghitung, mencatat sesuatu ke file atau menghapus pengguna acak dari database Anda. Ada perbedaan besar antara melakukan itu dua kali atau hanya sekali. Dalam hal ini, ada perbedaan yang jelas antaraobj.method(obj, etc)
danobj:method(etc)
.sumber