# Tables - Pitfalls and Bad Habits

- **İngilizce aslı:** https://wiki.facepunch.com/gmod/Tables:_Bad_Habits
- **Çeviri tarihi:** 2025-09-08

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.

```lua
-- 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](https://gmod.tr/wiki/table.HasValue)'nun her çağrısını bir döngü olarak genişletelim. Bu temel olarak fonksiyonu kendi anlamına çevirir.

```lua
-- 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](https://gmod.tr/wiki/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.

```lua
-- İ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!

```lua
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!

```lua
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](https://gmod.tr/wiki/number), [metinler](https://gmod.tr/wiki/string) ve [boolean](https://gmod.tr/wiki/boolean)lar her zaman aynı kabul edilir. Ancak [fonksiyonlar](https://gmod.tr/wiki/function), [tablolar](https://gmod.tr/wiki/table), [Vector](https://gmod.tr/wiki/Vector)'ler, [Angle](https://gmod.tr/wiki/Angle)'lar ve **NULL** [Entity](https://gmod.tr/wiki/Entity)'ler bellekte aslında farklıyken aynı gibi görünebilirler.

```lua
local function1 = function()
	print( "hello world" )
end

local function2 = function()
	print( "hello world" )
end

print( function1 )
print( function2 )

--[[
Çıktı:
function: 0x30afbb60
function: 0x30afde20
]]
```

- [GMod Wiki ana sayfası](https://gmod.tr/wiki)

---

[Tüm sunucular](https://gmod.tr/) · [GmodTR Launcher](https://gmod.tr/launcher) · [Rehber](https://gmod.tr/rehber) · [GMod Wiki](https://gmod.tr/wiki) · [GmodTR nedir?](https://gmod.tr/hakkinda) · [Sunucu ekle](https://gmod.tr/sunucu-ekle) · [Discord](https://discord.gg/gmodtr)

Kaynak: https://gmod.tr/wiki/Tables:_Bad_Habits
