Z Lua 5.1 documentation for load()
:Zachowanie obciążenia(), gdy funkcja zwraca nil kawałek
Ładunki kawałek użyciem funkcji
func
dostać swoje kawałki. Każde wywołanie dofunc
musi zwracać ciąg, który łączy się z poprzednimi wynikami. Zwrot pustego łańcucha, nil, lub żadna wartość nie sygnalizuje końca porcji.
Z moich testów nie jest to prawda. Lub raczej dokumentacja jest co najmniej myląca.
Rozważmy następujący przykład skrypt:
function make_loader(return_at)
local x = 0
return function()
x = x + 1
if x == return_at then return 'return true' end
return nil
end
end
x = 0
repeat
x = x + 1
until not load(make_loader(x))()
print(x)
Wyjście jest liczba kolejnych wywołań funkcji zwracanej przez make_loader()
że zwracany nil
przed load()
rezygnuje i zwraca funkcję powracającego nic.
Można oczekiwać, że wynik tutaj będzie "1", jeśli dokumentacja ma być wykonana według wartości nominalnej. Jednak wynik to "3". To implikuje, że argument do load()
jest wywoływany, dopóki nie zwróci go nil
przed przed load()
.
Z drugiej strony, jeśli funkcja kawałek natychmiast, a następnie nil
na kolejnych wywołań zwraca łańcuch, to zajmuje tylko jeden nil
przestać ładowania:
function make_loader()
local x = 0
return {
fn=function()
x = x + 1
if x == 1 then return 'return true' end
return nil
end,
get_x=function() return x end
}
end
loader = make_loader()
load(loader.fn)
print(loader.get_x())
Drukuje „2”, jak bym się spodziewał.
Moje pytanie brzmi: czy dokumentacja jest nieprawidłowa? Czy to zachowanie jest pożądane z jakiegoś powodu? Czy to po prostu błąd w load()
? (Wydaje się pojawiać zamierzone, ale nie mogę znaleźć żadnej dokumentacji wyjaśniając dlaczego.)
Czy próbowałeś Lua 5.2? –
@NicolBolas No. – cdhowie
Możesz spróbować. To prawdopodobnie błąd w Lua 5.1. –