2014-12-24 14 views
16

Solo una semplice domanda per principianti, sto codificando le cose di Lua per Garrys Mod, imparando leggendo wiki e altre codifiche.Posso controllare l'uguaglianza delle stringhe in lua?

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

quanto sopra è il codice che voglio usare, per verificare se l'ID VAPORE (che credo sia una stringa) è uguale alla mia stringa esatta.

È possibile? O c'è un altro modo in cui dovrei farlo?

+0

Solo una nota, non vorrei iniziare con la programmazione Lua con Mod di Garry. Usa stili di codifica discutibili (parentesi in istruzioni 'if'), sintassi non standardizzata ('! ',' || ',' && 'alias per' not', 'or', e' and'), e ha un pessimo API (sostituendo a caso i builtin come 'require' e' loadstring', 'FooEx' funzioni, ecc.). –

+0

Lua non è C, non è necessario se-condizione tra parentesi. È ridondante. –

risposta

18

Questo dovrebbe funzionare esattamente come ci si aspetta. In lua '==' per la stringa restituisce true se il contenuto delle stringhe è uguale.

Come è stato sottolineato nei commenti, le stringhe di lua sono internate, il che significa che le due stringhe che hanno lo stesso valore sono in realtà la stessa stringa.

+4

'==' è in realtà confronto di identità e non char-by-char (se non intenzionalmente sovraccarico). Ma tutte le stringhe di Lua sono internate, quindi le stringhe uguali sono sempre identiche e il test di uguaglianza non costa nulla. – user3125367

+0

Questa è davvero un'ottima cattura - non sapevo della parte interna. Grazie. – lisu

+0

@ user3125367: A partire da Lua 5.2.1 questo non è più vero poiché le stringhe più lunghe di 40 caratteri non sono più internate. Lua fa ancora The Right Thing in questo caso, che è il confronto carattere per carattere. Non so quale versione di Lua utilizza il Mod di Garry. – siffiejoe

1

Secondo http://wiki.garrysmod.com/page/Player/SteamID, SteamID() restituisce una stringa così si dovrebbe essere in grado di scrivere

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

Se hai bisogno di confermare il tipo di un oggetto, utilizzare type e print, come in questo caso print('type is', type(self.Owner:SteamID())) dovrebbe stampare 'type is string'.

2

Una cosa da considerare, mentre l'apprendimento Lua (da 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)) 

confronto stringa in Lua è a buon mercato, la creazione di stringa può non essere.