Ich habe eine Funktion, die ein Objekt (in diesem Fall ein Hammerspoon Notify-Objekt) erstellt, und ich möchte dieses Objekt als Parameter an eine anonyme Funktion übergeben, die selbst ist ein Argument für einen Funktionsaufruf.Rufen Sie eine anonyme Funktion mit einer lokalen Variablen als Parameter
Das ist eine sehr komplizierte Erklärung, aber ich denke, ein Beispiel macht es ziemlich klar.
function main()
local n = hs.notify(...)
print(n) -- `hs.notify: Title (0x7fbd2b5318f8)`
hs.timer.doAfter(1, function(n)
print(n) -- nil
n:withdraw() -- error: attempt to index a nil value (local 'n')
end)
end
Der Ausgang hiervon ist, dass n
druckt die erste Zeit (hs.notify: Title (0x7fbd2b5318f8)
) in Ordnung, aber ist nil
das zweite Mal, innerhalb der anonymen Funktion, und es gibt einen Fehler aus: attempt to index a nil value (local 'n')
.
Diese Art von Sinn macht Sinn, weil ich es nie wirklich übergebe. Gibt es eine Möglichkeit, es zu übergeben? Die Unterschrift des hs.timer.doAfter
Anruf ist: hs.timer.doAfter(sec, fn) -> timer
(http://www.hammerspoon.org/docs/hs.timer.html#doAfter)
Gibt es eine gute IDE oder einen statischen Codeanalysator? Wenn Sie die erste (oder alle) 'print (n)' Anweisung wegnehmen, würde eine gute IDE Sie warnen, dass Sie 'n' einen Wert zugewiesen haben, der nie benutzt wird, was Ihnen helfen würde, das Verstecken zu finden, das Kurt erklärt [Antwort] (http://stackoverflow.com/a/38407417/2226988). –