2014-12-24 16 views
16

Po prostu proste pytanie początkującego, koduję rzeczy Lua dla Garrys Mod, ucząc się czytając wiki i inne kodowania.Czy mogę sprawdzić równość ciągów w lua?

if (self.Owner:SteamID() == "STEAM_0:1:44037488") then 

powyższe jest kod Chcę użyć, aby sprawdzić, czy identyfikator STEAM (co wierzę, to ciąg) jest równa moim dokładnym ciąg.

Czy to możliwe? Czy jest inny sposób, powinienem to zrobić?

+0

Po prostu notka, nie zacznę z programowaniem Lua z Garry's Mod. Używa wątpliwych stylów kodowania (nawiasy w instrukcjach 'if'), niestandardowej składni ('! ',' || ',' && 'aliasów dla' not', 'lub' oraz' i '' aliasów dla 'nie',' lub 'oraz' i ') i ma bardzo złe API (losowe zastępowanie wbudowanych funkcji takich jak 'require' i' loadstring', 'FooEx', itd.). –

+0

Lua nie jest C, nie potrzebujesz warunku if w nawiasach. Jest zbędny. –

Odpowiedz

18

To powinno działać dokładnie tak, jak tego oczekujesz. W lua '==' dla łańcucha zwróci wartość true, jeśli zawartość ciągów jest równa.

Jak zauważono w komentarzach, struny lua są internowane, co oznacza, że ​​dwa ciągi, które mają tę samą wartość, są w rzeczywistości tym samym ciągiem znaków.

+4

'==' jest w rzeczywistości porównywaniem tożsamości, a nie char-by-char (chyba że celowo przeciążone). Ale wszystkie struny Lua są internowane, więc równe łańcuchy są zawsze identyczne, a test równości nic nie kosztuje. – user3125367

+0

To naprawdę dobry chwyt - nie wiedziałem o części interningowej. Dzięki. – lisu

+0

@ user3125367: Zaczynając od Lua 5.2.1, nie jest to już prawdą, ponieważ ciągi dłuższe niż 40 znaków nie są już internowane. Lua nadal ma w tym przypadku The Right Thing, czyli porównanie znaków po znaku. Nie wiem, której wersji Luy używa Garry's Mod. – siffiejoe

1

Według http://wiki.garrysmod.com/page/Player/SteamID, SteamID() zwraca ciąg znaków, więc powinieneś być w stanie napisać

if self.Owner:SteamID() == "STEAM_0:1:44037488" then 
    ...do stuff... 
end 

Jeśli kiedykolwiek potrzeba, aby potwierdzić typ obiektu, użyj type i print, jak w tym przypadku print('type is', type(self.Owner:SteamID())) powinien wydrukować "type is string".

2

Jedną rzeczą do rozważenia podczas nauki Lua (od www.lua.org/source/5.2/lstring.h.html):

/* 
** as all string are internalized, string equality becomes 
** pointer equality 
*/ 
#define eqstr(a,b)  ((a) == (b)) 

porównanie String w Lua jest tani, tworzenie ciąg może nie być.