Metametodlar
Metamethod Nedir?
Metamethod'lar, Lua tabloları üzerinde gerçekleştirilen belirli işlemleri geçersiz kılmanıza olanak tanıyan özel fonksiyonlardır. Bir metamethod tablosu başka bir tabloya uygulandığında, o tablonun Meta Tablosu olarak bilinir. Doğru kullanıldığında, tabloların başka türlü mümkün olmayan çok benzersiz ve karmaşık şekillerde davranmasını sağlayabilirler. Ayrıca Lua'daki nesne yönelimli programlamanın arkasındaki güç merkezidirler.
Lua'da metatable'lar olmadan da tatmin edici bir hayat sürebilirsiniz, ancak umarız pratik bir örnekle onların ne kadar kullanışlı olduğunu görürsünüz.
Burada bir metatable'ın bazı metamethod'larının nasıl bir araya geldiği gösterilmektedir.
Dikkate Değer Kullanımlar
Metamethod'ların belki de en kullanışlı olanları __call ve __index girişleridir.
__call
__call, bir metatable'a sahip tabloların bir fonksiyon gibi çağrılmasına olanak tanır ve bu çağrıda tablo ilk argüman olarak geçirilir.
__index
__index çok daha ilginçtir ve metamethod'lara güçlerinin çoğunu veren şeydir. Bir tablo veya bir fonksiyon olabilir.
Eğer bir tabloysa, nesne belirtilen anahtar için içindeki girişlere bakacaktır. Bu, meta.__index tablosunda tanımlanan fonksiyonların nesne tablosu üzerinde çağrılmasına olanak tanıyan şeydir. İlk örnekte yazılan "metaIndex" değişkenine bakın.
Eğer bu index tablosunun da kendi metatable'ı varsa ve anahtarı bulamazsa, bu yeni metatable kullanılacak ve bir dönüş değerine veya index zincirinin sonuna ulaşana kadar (hangisi önce gelirse) zinciri takip edecektir. İşte bunun neye benzediğine dair bir örnek.
Doğru kullanıldığında, bu, entity .Base kalıtımının çalışma şekline çok benzer sonuçlar elde etmenizi sağlar.
Ve eğer bir fonksiyonsa, fonksiyonu çağıracak ve döndürülen değeri sağlayacaktır. Bu örnek, bir tabloya "varsayılan bir değer" vermenin en basit yoludur.
Metatable'ın __index girişini metatable'a referans verecek şekilde ayarlayarak, burada gösterilenden çok daha küçük ve daha az karmaşık metatable'lar yazmak mümkündür. Örnek:
Metatable'ları yazmanın birçok farklı yolu vardır ve hepsi onu ne için kullanacağınıza ve Lua nesnelerinin ne yapmasına ihtiyacınız olduğuna bağlıdır.
Tüm Metamethod'ların Listesi
Tüm metamethod adları __ ile başlar ve mantıksal olarak adlandırılır (ör. __add, + operatörüne karşılık gelir).
Her bir metamethod'un daha ayrıntılı açıklamaları için bu sayfaya bakın.
Örnekle Öğrenin
Yaygın bir programlama görevi, bir öğeyi birçok öğeyle karşılaştırmaktır. Örneğin, bir oyuncunun bir anahtar kelime söyleyip söylemediğini kontrol etmek istediğimizde, table.HasValue kullanabilirsiniz
Bu yaklaşımla ilgili sorun, HasValue'nin esasen meyve değişkeninin kelime değişkenine eşit olup olmadığını kontrol eden bir for döngüsü olmasıdır. Büyük tablolarla, HasValue'yi yeterince sık kontrol ederseniz, programınızı gerçekten yavaşlatacaktır! Bunun yerine, aşağıdakileri yaparak bunu daha verimli hale getirebiliriz.
Bu çözüm oldukça şıktır. hasFruit[...] kelime tablomuzdaysa true, değilse nil döndürür.
Metatable Örneği
Birden fazla metamethod'u kullanıma sokan bir örnek, metamethod'larla neler yapabileceğinizin olanaklarını gösteren bu Set betiğidir. Aşağıdaki kodu lua/autorun klasöründe özel bir .lua betiği oluşturarak kolayca çalıştırabilirsiniz. İyi öğrenmeler!
Basit Bir Test
Tüm meyveler beklendiği gibi yazdırılır, ancak bunun sırasız bir öğe kümesi olduğunu unutmayın. Onları belirli bir sırada istiyorsanız, sıralamanız gerekecektir.
Ayrıca Bakınız
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord