Lua non può dare magicamente agli argomenti originali nuovi valori. Potrebbero non essere più in pila, a seconda delle ottimizzazioni. Inoltre, non vi è alcuna indicazione su dove si trovava il codice quando è stato rilasciato, quindi potrebbe non essere più in grado di vedere quegli argomenti. Ad esempio, se la coroutine ha chiamato una funzione, quella nuova funzione non può vedere gli argomenti passati in quello vecchio.
coroutine.yield()
restituisce gli argomenti passati alla chiamata resume
che continua la coroutine, in modo che il sito della chiamata di rendimento possa gestire i parametri così come desidera. Permette al codice di riprendere a comunicare con il codice specifico facendo il rendimento. yield()
passa i suoi argomenti come valori di ritorno da resume
e resume
passa i suoi argomenti come valori di ritorno a yield
. Questo crea un percorso di comunicazione.
Non è possibile farlo in altro modo. Certamente non modificando argomenti che potrebbero non essere visibili dal sito yield
. È semplice, elegante e ha un senso.
Inoltre, è considerato estremamente scortese andare a colpire i valori di qualcuno. Soprattutto una funzione già in funzione. Ricorda: gli argomenti sono solo variabili locali piene di valori. L'utente non dovrebbe aspettarsi che il contenuto di quelle variabili cambi, a meno che non cambi le stesse. Sono variabili, dopotutto. Possono essere modificati solo localmente; da qui il nome.
fonte
2012-11-16 21:19:20
Mi sembra che questo non risponda alla domanda.L'OP riguardava l'API/c/funzioni lua_resume() e lua_yield(), che hanno una semantica diversa dalla libreria standard 'coroutine.resume()', ecc. (Ad esempio, lua_resume accetta tre argomenti - due sono lua_State ...) – BadZen
Penso che risponda alla domanda sullo scopo del passaggio dei parametri e fornisce un esempio che è facile provare con un interprete Lua. Infatti, OP ha detto tanto nel suo commento sotto la risposta di Nicol. Puoi sempre fornire la tua risposta se pensi di averne una migliore. –
C'è una grande differenza tra l'oggetto coroutine in libs (che ad esempio incapsula un lua_State) e utilizza l'API C. Non ho una risposta migliore, quindi ho aperto un'altra domanda chiedendo in particolare l'API C. La risposta di Nichol e la tua qui parlano entrambi dell'oggetto della biblioteca di coroutine. Ci sono circa 100 linee di codice che la implementano in termini di API lua_ *. Non è ovvio e la documentazione è breve nei dettagli. – BadZen