Questa è una domanda sulle continuazioni di Scala. resets
può essere annidato? Se possono: a cosa serve l'nidificazione resets
? C'è qualche esempio di nidificato resets
?Esempio di reimpostazioni nidificate in Scala
risposta
Sì, reset
s può essere annidato e, sì, può essere utile. Ad esempio, di recente ho prototipato un'API per lo scalagwt project che consentirebbe agli sviluppatori GWT di scrivere RPC asincroni (chiamate di procedure remote) in uno stile diretto (in opposizione allo stile di passaggio di callback utilizzato in GWT per Java). Ad esempio:
field1 = "starting up..." // 1
field2 = "starting up..." // 2
async { // (reset)
val x = service.someAsyncMethod() // 3 (shift)
field1 = x // 5
async { // (reset)
val y = service.anotherAsyncMethod() // 6 (shift)
field2 = y // 8
}
field2 = "waiting..." // 7
}
field1 = "waiting..." // 4
I commenti indicano l'ordine di esecuzione. Qui, il metodo async
esegue un reset
e ogni chiamata di servizio esegue un shift
(è possibile vedere l'implementazione su my github fork, in particolare Async.scala).
Nota come il nidificato async
modifica il flusso di controllo. Senza di esso, la riga field2 = "waiting"
non verrà eseguita fino a dopo il completamento con esito positivo del secondo RPC.
Quando un RPC è fatto, l'attuazione cattura la continuazione fino al più interno async
confine e sospende per un esecuzione dopo il completamento della RPC. Pertanto, il blocco nidificato async
consente al controllo di passare immediatamente alla riga successiva non appena viene creato il secondo RPC. Senza quel blocco nidificato, d'altra parte, la continuazione si estenderebbe fino alla fine del blocco esterno async
, nel qual caso tutto il codice all'interno dello async
esterno verrebbe bloccato su ogni RPC.
reset
forma un'astrazione in modo che il codice esterno non sia influenzato dal fatto che il codice interno è implementato con la magia di continuazione. Quindi, se stai scrivendo il codice con reset e shift, può chiamare un altro codice che può essere implementato o meno con reset e shift. In questo senso possono essere annidati.
- 1. Qualche esempio di giochi in Scala?
- 2. Riproduci Scala: json writer per classi nidificate
- 3. Compilatore presentazione Scala - Esempio minimo
- 4. Accesso a classi nidificate di Scala da Java
- 5. Scala Monad - Esempio completo di lavoro
- 6. Contravarianza scala - esempio di vita reale
- 7. Come ottenere esempio in scala di un BufferedImage
- 8. Cosa significa la tilde (~) in questo esempio di Scala?
- 9. Stile Scala: fino a che punto sono nidificate le funzioni?
- 10. Esempio interprete Scala REPL incorporato per 2,10
- 11. Esempio di corrispondenza delle stringhe di Scala best practice
- 12. Transazioni nidificate in TSQL
- 13. Interrogazioni nidificate in Arel
- 14. Perché questo esempio di parametro implicito Scala non funziona?
- 15. Esempio di progetto su larga scala usando QML?
- 16. Comportamento transazioni nidificate in EF6
- 17. Scala Pickling: scrittura di un pickler/unpickler personalizzato per strutture nidificate
- 18. Modo generico e sicuro da un tipo per appiattire le raccolte nidificate arbitrariamente in Scala?
- 19. Esempio MVVM/Esempio di implementazione in iOS
- 20. Analisi di espressioni ternarie nidificate
- 21. Dichiarazioni di prova nidificate in python?
- 22. Stampa multipla di collezioni (nidificate) in Java
- 23. Strutture nidificate di marshall in JSON
- 24. di query nidificate non lavorare in Cassandra
- 25. risorse nidificate in Django tastypie
- 26. transazioni nidificate in SQL Server
- 27. creando sequenze nidificate in R
- 28. risorse nidificate in namespace form_for
- 29. intesa `Monomorphism` Esempio di Shapeless
- 30. "nidificate" scoped_lock