Mi sembra che with-redefs
possa fare tutto ciò che può fare binding
in un simbolo dinamico, solo che non ha la limitazione di richiedere i metadati ^:dynamic
. Quindi, quando dovrei usare uno sull'altro?Qual è il punto di definire qualcosa di dinamico quando non è necessario definire qualcosa di così dinamico da ridistribuirlo?
risposta
Oltre a richiedere i metadati ^:dynamic
, binding
crea anche collegamenti visibili solo nel thread corrente, mentre i binding effettuati da with-redefs
sono visibili in tutti i thread. Quindi, with-redefs
è uno strumento molto smussato e ha il potenziale di influenzare altri codici in esecuzione nella stessa macchina virtuale. Non ho mai visto with-redefs
usato al di fuori del codice di test, né dovrebbe essere (almeno secondo me).
vorrei riassumere la differenza tra i due, come in tal modo:
- vincolante con ^: dinamica consente di introdurre un po 'di comportamento dinamico in modo controllato. È un buon modo per definire i punti di estensione in un'API che consente ai chiamanti di risalire la catena di chiamate a modificare il comportamento del codice senza dover passare esplicitamente i parametri attraverso lo stack di chiamate (alcuni dei quali potrebbero non essere nemmeno il loro codice).
- con-redefs è un free-for-all. È utile nel test, ad es. per deridere interi sottosistemi quando la funzione sotto test ha molte dipendenze.
Dichiarazione di una var come ^:dynamic
, insieme con la convenzione di usare cuffie antirumore per citarne Vars dinamici (ad esempio *my-dynamic-var*
), ha il valore aggiunto che si tratta di un modo di auto-documentazione di pubblicità per i chiamanti che quella parte del codice può essere modificato dinamicamente.
In sintesi: preferiscono ^: dinamica e vincolante durante la scrittura di API e il codice di produzione. Utilizzare con-redefs in fase di test e come ultima risorsa per modificare dinamicamente il comportamento di vars al di fuori del proprio controllo che non è stato dichiarato ^:dynamic
(e quindi, utilizzare con cautela).
- 1. Chiamando da un txt per definire qualcosa ... Python
- 2. Come dovrei definire qualcosa di costante come in Erlang
- 3. Qual è la differenza tra linker dinamico e caricatore dinamico?
- 4. Perché è necessario utilizzare il punto e virgola prima di definire una funzione?
- 5. Qual è la differenza tra il posizionamento del colon in: qualcosa e qualcosa di simile:
- 6. Il secondo argomento di `respond_to_missing?` È utile per qualcosa?
- 7. Qual è il punto di jQuery ajax accetta attrib? Effettivamente fa qualcosa?
- 8. È possibile definire qualcosa come 'between' in if-else in C#?
- 9. Qual è il punto di impalcatura?
- 10. Che è di tipo dinamico dell'oggetto
- 11. jQuery.html (qualcosa) rileva quando l'iniezione è completa
- 12. Quindi: qual è il punto?
- 13. Qual è il punto di ingresso grande?
- 14. Qual è il punto di XPS?
- 15. Qual è il metodo migliore per sandbox in linea dinamico in modo dinamico?
- 16. Macro elisir: come definire la funzione con aritm dinamico
- 17. Qual è il punto di SharedPreferences.getFloat()
- 18. Qualcosa come rilevatore di codice non necessario per NetBeans
- 19. Qual è il vantaggio di definire i metodi Go lontano dalle definizioni di struct?
- 20. Qual è il punto di questo codice?
- 21. Verificare se qualcosa è un'istanza di ArrayCollection
- 22. Fare qualcosa DOPO che la pagina è stata caricata completamente
- 23. WPF Tooltip: Mostra solo quando il testo è qualcosa
- 24. È possibile definire un operatore senza %%?
- 25. Inserimento dinamico e dinamico di file JSP
- 26. Come definire il metodo di istanza in ruby in modo dinamico?
- 27. Il programma "si" è usato per qualcosa di significativo?
- 28. Qual è il punto di avere wmemcpy?
- 29. Qual è la sintassi legale per definire il modello annidato?
- 30. Qual è il punto di "javascript:" in codice (non URL)?
Buona risposta. Ho visto quella convenzione di denominazione dei paraorecchie e non ho capito cosa significasse. Dovrei usare questa convenzione di denominazione anche su funzioni dinamiche o semplicemente su valori primitivi? –
Non ho mai visto i paraorecchie su un 'defn' per una funzione in un'API pubblica. Per una funzione vincolata dinamicamente, farei qualcosa in questo modo: https://gist.github.com/alexhall/5286484 – Alex
Questo ha senso. Anche se guardo attraverso il progetto clj-http, non lo fa. Mette la dinamica sul defn. –