2016-08-24 3 views
7

Ich benutze Lua 5.3.Wie finde ich ein `f`, das` pcall (pcall, f) `` false` in Lua zurückgibt?

Lesen 'Programmierung in Lua 3. Ausgabe', kam ich in eine Übung, die mich auffordert, eine f zu finden, die pcall(pcall, f)false Rückkehr macht. Ich denke, das ist äquivalent zu machen pcall(f) einen Fehler auslösen. Aber scheint Verwendung pcall auf etwas wird das nicht tun. Zum Beispiel lassen Sie f = nil und nichts Schlimmes passiert.

Allerdings habe ich im Internet gefunden, dass f = (function() end)() den Trick macht. Aber ich verstehe nicht warum. Hier f ist nur der Rückgabewert (nil) der Funktion function() end richtig?

Antwort

6

funktioniert das nicht

> f = (function() end)() 
> pcall(pcall, f) 
true false attempt to call a nil value 

aber dies tut:

> pcall(pcall,(function() end)()) 
false bad argument #1 to 'pcall' (value expected) 

Der Unterschied besteht darin, dass (function() end)() keinen Wert zurückgibt, die von der Rückkehr nil unterscheidet. In Lua geschriebene Funktionen können diese Unterscheidung nicht vornehmen, aber pcall ist in C geschrieben und kann diese Unterscheidung vornehmen. (Weitere Beispiele sind print und type.)

Beachten Sie, dass dies verhält sich wie erwartet (entspricht dem ersten Versuch):

> pcall(pcall,(function() return nil end)()) 
true false attempt to call a nil value 
+0

Dank. Es ist also etwas nicht wert, es zu bemerken? –

+0

"In Lua geschriebene Funktionen können diese Unterscheidung nicht treffen": das ist etwas, das 'select ('#', ...)' liefern kann, oder nicht: '(function (...) print (select ('# ', ...)) Ende) ((Funktion() Ende)()) '? –

+0

@PaulKulchenko, ja, aber Sie brauchen Hilfe von einer Bibliotheksfunktion wie 'Select'. – lhf

2

Dies liegt daran, dass der Code, den Sie anrufen, pcall(pcall) entspricht, nicht pcall(pcall, nil). Die Funktion gibt nichts zurück; Es ist adjusted zu nil in einigen Kontexten, aber unterscheidet sich immer noch von nil in anderen Kontexten (wie in diesem Beispiel).