Ich dachte, dass QML Lambda-Funktionen unterstützt, weil JavaScript anonyme Funktionen unterstützt und dass Funktionen zwar erstklassige Objekte sind, aber nicht so funktionieren, wie ich es erwartet habe. Nimm diesen Code:
%Vor% Ich versuche, das Lambda function() { handler( item ); }
zu verwenden, so dass, wenn das Signal someObj::someValueChanged
ausgegeben wird, das emittierende Element an die Funktion handler( item )
übergeben wird.
I angenommen dass jede Schleife eine neue Instanz des Lambda erzeugen würde und dass die item
Referenz die Referenz der someObj
Instanz enthalten würde, die in dieser Schleife erstellt wurde (dh item
würde vom Lambda erfasst werden). Aber das scheint nicht der Fall zu sein, denn die Ausgabe ist:
Wie Sie sehen, wird entweder die gesamte Funktion in jeder Schleife oder nur die item
Referenz ersetzt, so dass letztendlich nur auf die zuletzt erstellte someObj
verwiesen wird. Kann mir jemand erklären, warum Lambdas (wenn das überhaupt ist, was es ist) nicht so funktionieren, wie ich es erwarte? Und ist das ein QML-Problem oder ein allgemeines JavaScript?
Versuchen Sie etwas wie folgt:
%Vor%Intuitiv, oder? : D
Wenn JS "block scope" verwendet, würden 3 verschiedene item
s für jede Schleifeniteration referenziert werden, und es würde "wie erwartet funktionieren". Aber mit "Funktionsumfang" wird nur ein item
referenziert, und es verweist auf seinen endgültigen Wert, daher muss dieser Hack verwendet werden, um jeden Wert in der Zeit zu erfassen.
Tags und Links javascript qt lambda qml