2014-12-24 7 views
16

Nur eine einfache Anfängerfrage, ich kodiere Lua Zeug für Garrys Mod, lerne durch das Lesen von Wiki und anderen Codierungen.Kann ich die Zeichenkettengleichheit in lua überprüfen?

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

den oben ist der Code, den ich verwenden möchte, um zu prüfen, ob die ID STEAM (was ich glaube ist ein String) auf meine genaue Zeichenfolge entspricht.

Ist das machbar? Oder gibt es einen anderen Weg, ich sollte es tun?

+0

Nur eine Notiz, ich würde nicht mit Lua-Programmierung mit Garry Mod loszulegen. Es verwendet fraglich Codierung Stile (Klammer in 'if'-Anweisungen), nicht standardisierte Syntax ('! ',' || ',' '&& Aliase für' not', 'or' und' und') und hat eine ziemlich schlecht API (zufällige Ersetzung von Builtins wie 'require' und' loadstring', 'FooEx' -Funktionen usw.). –

+0

Lua ist nicht C, du brauchst keine Bedingung in Klammern. Es ist überflüssig. –

Antwort

18

Dies sollte genau funktioniert, wie Sie es erwarten. In lua '==' für string wird true zurückgegeben, wenn der Inhalt der Strings gleich ist.

Wie es in den Kommentaren darauf hingewiesen werden lua Strings interniert, was bedeutet, dass zwei beliebige Zeichenfolgen, die den gleichen Wert sind eigentlich die gleiche Zeichenfolge haben.

+4

'==' ist eigentlich Identitätsvergleich und nicht char-by-char (außer absichtlich überladen). Aber alle Lua-Strings sind interniert, daher sind gleiche Strings immer identisch und Gleichheitstest kostet nichts. – user3125367

+0

Das ist in der Tat ein sehr guter Fang - ich wusste nichts über den Praktikumsteil. Vielen Dank. – lisu

+0

@ user3125367: Beginnend mit Lua 5.2.1 gilt das nicht mehr, da Strings länger als 40 Zeichen nicht mehr interniert sind. Lua macht immer noch das Richtige in diesem Fall, was ein Zeichen-für-Zeichen-Vergleich ist. Ich weiß nicht, welche Lua-Version Garry's Mod benutzt. – siffiejoe

1

Nach http://wiki.garrysmod.com/page/Player/SteamID, SteamID() einen String zurückgibt, so sollten Sie in der Lage sein

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

zu schreiben Wenn Sie jemals den Typ eines Objekts bestätigen müssen, verwenden Sie type und print, wie in diesem Fall print('type is', type(self.Owner:SteamID())) sollte drucken 'Typ ist Zeichenfolge'.

2

Eine Sache, zu prüfen, während Lua Lernen (von 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)) 

String Vergleich in Lua billig ist, kann Zeichenfolge Schöpfung nicht.

Verwandte Themen