Tables - Pitfalls and Bad Habits

Tabloları verimsiz bir şekilde kullanmak o kadar yaygın ki, şikayet etmek yerine bir rehber yayınlıyorum.

Bu rehberi tüm Lua programlama topluluğunda, özellikle yeni başlayanlarla paylaşmaktan çekinmeyin!

Aşağıdaki örnekler gösterildikleri gibi çalışmayabilir. Sadece öğretim amacıyla verilmişlerdir.

Örnek 1

Açıklama: Bu örnek, bazı takımlar tarafından kullanılabilen araç sınıflarını kısıtlar.

Bu örnek, gereksiz döngüler kullanmak verimsiz olduğu için neyin yapılmaması gerektiğini gösterir.

-- KÖTÜ KOD ÖRNEĞİ: KULLANMAYIN local RestrictedTeams = { TEAM_COOK, TEAM_CITIZEN, TEAM_MOB, } local AllowedVehicles = { "prop_vehicle_jeep", "prop_vehicle_airboat", "prop_vehicle_custom1", "prop_vehicle_custom4", "prop_vehicle_custom5" } hook.Add( "CanPlayerEnterVehicle", "restrict vehicles", function( ply, veh ) if table.HasValue( RestrictedTeams, ply:Team() ) then if not table.HasValue( AllowedVehicles, veh:GetClass() ) then return false end end end )

Şimdi table.HasValue'nun her çağrısını bir döngü olarak genişletelim. Bu temel olarak fonksiyonu kendi anlamına çevirir.

-- KÖTÜ KODUN GENİŞLETİLMİŞ HALİ: KULLANMAYIN hook.Add( "CanPlayerEnterVehicle", "restrict vehicles", function( ply, veh ) local Value = ply:Team() local HasValue = false for k, v in pairs( RestrictedTeams ) do if ( v == Value ) then HasValue = true break end end if HasValue then local Value = veh:GetClass() local HasValue = false for k, v in pairs( AllowedVehicles ) do if ( v == Value ) then HasValue = true break end end if not HasValue then return false end end end )

table.HasValue kullanarak tablolar üzerinde döngü yaptığınızı şimdi açıkça görüyorsunuz. Durumların %99'unda, bir tablodaki bir değerin varlığını kontrol etmek CPU zamanı israfıdır. Bu yöntemi kullanmak küçük tablolar için çok kötüdür ve büyük tablolar için ise anlamsızdır.

Sıradaki kod, tablolarınızı nasıl verimli hale getireceğinizi gösterir; döngü yok, fonksiyon çağrısı yok! Sadece bir anahtarın varlığına dayanır (asla bir değere değil): anahtarlar bunun için tasarlanmıştır.

-- İYİ KOD ÖRNEĞİ local RestrictedTeams = { [TEAM_COOK] = true, [TEAM_CITIZEN] = true, [TEAM_MOB] = true } local AllowedVehicles = { prop_vehicle_jeep = true, prop_vehicle_airboat = true, prop_vehicle_custom1 = true, prop_vehicle_custom4 = true, prop_vehicle_custom5 = true } hook.Add( "CanPlayerEnterVehicle", "restrict vehicles", function( ply, veh ) if RestrictedTeams[ply:Team()] and not AllowedVehicles[veh:GetClass()] then return false end end )

Doğrudan bir anahtar kullanarak tablonun içindeki değeri kontrol ediyoruz! Eğer değer true ise anahtar tablodadır, aksi takdirde nil'dir, bu da bir koşulda false'a eşdeğerdir. Bu işlem çok ucuzdur ve buna değer.

Bu örnek, sayı veya metin olan anahtarları içeren tablolar kullanır, ancak bunlar aynı zamanda entity'ler, vector'ler, angle'lar vb. de olabilir.

Aynı Anahtarlar

Ancak bir şeye dikkat edin: nesneler aynı değerlere sahip olabilir ama yine de farklı olabilirler!

local angle1 = Angle( 90, 0, 0 ) local angle2 = Angle( 90, 0, 0 ) print( "açılar aynı (1):", ( angle1 == angle2 ) ) angle2.p = 180 print( "açılar aynı (2):", ( angle1 == angle2 ) ) --[[ Çıktı: açılar aynı (1): true açılar aynı (2): false ]]

Gördüğünüz gibi, bu açılar aynı olmasına rağmen bellekte 2 farklı nesnedirler!

local vector1 = Vector( 100, 0, 0 ) local vector2 = Vector( 100, 0, 0 ) local TestTable = {} TestTable[ vector1 ] = true TestTable[ vector2 ] = true for vector in pairs( TestTable ) do print( "vektör şudur", vector ) end --[[ Çıktı: vektör şudur 100 0 0 vektör şudur 100 0 0 ]]

Örneğin, aynı sayılar, metinler ve booleanlar her zaman aynı kabul edilir. Ancak fonksiyonlar, tablolar, Vector'ler, Angle'lar ve NULL Entity'ler bellekte aslında farklıyken aynı gibi görünebilirler.

local function1 = function() print( "hello world" ) end local function2 = function() print( "hello world" ) end print( function1 ) print( function2 ) --[[ Çıktı: function: 0x30afbb60 function: 0x30afde20 ]]

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord