javascript: array of functions - parameter?
wergor 15.12.2016 - 14:16 2679 5
wergor
connoisseur de mimi
|
ich parse eine .ini file mit kommandos darin und erstelle ein array von funktionen. manche der kommandos haben zusätzlich einen parameter, z.b.: [Commands]
command_0 = Wait(500)
die kommandos werden in ein array aus funktionen übersetzt: if (command.match(/^Wait\((.*)\)$/)) //matches Wait(xxx)
sequence.commands.push(function() {
var time = command.match(/^Wait\((.*)\)$/)[1];
return sleep(time + "ms");
});
das beispiel oben funktioniert wie gewünscht. das beispiel unten nicht: hier ist zur laufzeit die variable "command" (die mit RegEx ausgewertet wird) undefined. if (command.match(/^PowerOn(\((.*)\))?$/)) //matches ^PowerOn$ and ^PowerOn(xxx)$
sequence.commands.push(function() {
if (command.match(/^PowerOn(\((.*)\))?$/)[2]) { //sets voltage if voltage has been given
var voltage = command.match(/^PowerOn\((.*)\)$/)[2] * 10e3; //convert from V to mV
setParameter("Voltage", voltage);
}
return setContact("VCC", true);
});
ich finde den fehler nicht, hat jemand von euch eine idee, oder einen vorschlag wie man das besser lösen kann?
Bearbeitet von wergor am 15.12.2016, 14:18
|
JC
AdministratorDisruptor
|
Warum escapst du die Klammern nicht? command.match(/^PowerOn(?:\((\w+)\))?$/)Zum Testen würde ich persönlich /regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen.
|
ill
...
|
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?
Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
|
wergor
connoisseur de mimi
|
Warum escapst du die Klammern nicht?
command.match(/^PowerOn(?:\((\w+)\))?$/)
Zum Testen würde ich persönlich /regexp/.test(string)
verwenden, oder aber zumindest beim Setzen von Voltage auf var voltage = RegExp.$1;
(aus meinem Beispiel oben) zurückgreifen, anstatt erneut zu prüfen. die klammern sind optional. falls sie existieren muss ich den wert darin übernehmen. Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?
Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope? der code oben ist im selben scope (ist eine liste von else if (command.match(x)) {} ), wird aber in einem anderen scope ausgeführt, wo command nicht existiert. ich habe es zuerst mit Wait versucht, und weil das funktioniert hat bin ich davon ausgegangen dass entweder die regex zum zeitpunkt des erstellens ausgewertet wird (und in der funktion dann command nicht mehr benötigt wird) oder command im scope behalten wird. offenbar ist aber beides nicht der fall, deshalb frage ich mich warum das beispiel mit Wait funktioniert
|
JC
AdministratorDisruptor
|
Ist "command" schon in der ersten Zeile, also beim "PowerOn" match undefined?
Wäre interessant, wie die Variable überhaupt befüllt wird. Sind die beiden checks in der selbem File? Im selben Scope?
Die Klammern bilden doch immer eine Capturing Group, außer du escapst sie. Dein Beispiel mit Wait erzeugt zwei Capturing Groups, wobei beide immer den gleichen Inhalt besitzen. Zudem ist in deiner Gruppe immer die Klammer inkludiert, also in deinem Beispiel "(500)". Dein Beispiel funktioniert nur wegen dem Dot-Star und würde etwa auch "Waitfoobar" oder "Wait for me, darling!" matchen.
|
wergor
connoisseur de mimi
|
jetzt verstehe ich was du meinst. die klammern werden schon escaped, aber die forensoftware hat die "\" beim posten offenbar gelöscht. die klammern sind optional, falls sie existieren enthält die erste capturing group "(value)" und die zweite "value", deshalb arbeite ich in den skripts nur mit capturing group 2 (ausnahme: "Wait" hat immer die klammern, deshalb ist die regex in den fall etwas anders) was in den klammern tatsächlich drin steht ist für mich nicht so wichtig - wenn keine zahl übergeben wird wirft das framework beim aufruf der funktion einen fehler und herr dipl.ing. user muss seine .ini files fixen
|