2016-07-16 59 views
4

我有一個函數可以創建一個對象(在本例中是一個Hammerspoon Notify對象),我想將這個對象作爲參數傳遞給本身的匿名函數一個函數調用的參數。用局部變量調用一個匿名函數作爲參數

這是一個非常複雜的解釋,但我認爲一個例子很清楚。

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 

的這個輸出是n打印精第一次(hs.notify: Title (0x7fbd2b5318f8)),但是nil所述第二時間,所述匿名函數的內部,並且引發一個錯誤:attempt to index a nil value (local 'n')

這種說法很有道理,因爲我從來沒有真正把它傳入。有沒有辦法將它傳入? 的hs.timer.doAfter呼叫的簽名是:hs.timer.doAfter(sec, fn) -> timerhttp://www.hammerspoon.org/docs/hs.timer.html#doAfter

+0

是否有良好的IDE或靜態代碼分析器可供您使用?如果您拿走了第一個(或全部)'print(n)'語句,一個好的IDE會警告您,您已經爲'n'分配了一個永遠不會使用的值,這將幫助您檢測Kurt在他的解釋中隱藏的[應答](http://stackoverflow.com/a/38407417/2226988)。 –

回答

8

匿名函數的定義包括名爲n一個參數,隱藏從外部範圍的n變量的聲明。函數聲明創建了一個新的局部變量nil,除非實際將參數傳遞給該函數,但調用匿名函數的計時器函數不期望傳入任何內容,因此函數本地n保持爲零。

您可以通過簡單地從匿名函數中刪除參數聲明來修復它,但在函數中保留n的用法。然後它將捕獲外部示波器的n變量,該變量的值從hs.notify(...)返回。

function main() 
    local n = hs.notify(...) 
    print(n)   -- `hs.notify: Title (0x7fbd2b5318f8)` 
    hs.timer.doAfter(1, function() -- <== no argument 
     print(n)  -- nil 
     n:withdraw() -- error: attempt to index a nil value (local 'n') 
    end) 
end 
相關問題