Uso nel mondo reale di oggetti vincolanti nel rubino
-
05-07-2019 - |
Domanda
La scorsa notte, stavo pensando a quelle che penso siano funzionalità avanzate del linguaggio rubino, vale a dire Continuations (callcc) e oggetti Binding. Intendo avanzato perché ho uno sfondo di lingue scritte in modo statico (C #, Java, C ++), ho scoperto ruby ??di recente, quindi queste caratteristiche del linguaggio non mi sono molto familiari.
Mi chiedo quale potrebbe essere l'uso nel mondo reale di queste funzionalità delle lingue. Nella mia esperienza, tutto potrebbe essere fatto con lingue parlate in modo statico, ma a volte non sono molto intelligente. Penso di aver capito la bellezza / l'interesse della continuazione leggendo quel bel articolo di Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons
Tuttavia, mi sono perso con l'oggetto Binding. Qualcuno può fornirmi alcuni esempi del mondo reale di qualcosa che può essere fatto in modo intelligente con l'oggetto Binding ma non in modo molto intelligente con le lingue che mancano del concetto di Binding rubino?
Stavo pensando di ripristinare alcuni oggetti al loro stato iniziale quando qualcosa va storto durante un lungo processo, ma non sono sicuro che questo possa essere implementato con l'oggetto Binding e penso che potrebbe essere implementato in modo abbastanza intelligente clonando oggetti prima che elaborazione e sostituzione di oggetti modificati con i loro cloni quando qualcosa va storto durante l'elaborazione. Quindi questo non è un esempio valido, credo.
Grazie in anticipo per il tuo aiuto.
Soluzione
Ho usato la classe di associazione per implementare un hack di debug.
class Array
def debug binding
each do |arg|
puts "arg = #{eval(arg, binding).inspect}"
end
end
end
Puoi utilizzarlo per esaminare un elenco di frammenti di codice Ruby insieme a ciò che restituisce ogni frammento:
# .. some hairy code you want to debug ...
['user','current_resource', 'user.owns?(current_resource)'].debug(binding)
che stamperà
user = #<User id:1, username: 'joe', ...
current_resource = #<Comment id:20, ...
user.owns?(current_resource) = false
Lo trovo molto utile per il debug rapido.
Avevo bisogno di usare un oggetto vincolante per acquisire l'ambito in cui viene chiamato debug
in modo che possa essere utilizzato in eval
quando debug
è correre. Probabilmente ci sono altri modi per implementarlo, ma l'uso dell'associazione è stato facile e veloce. Probabilmente ci sono anche esempi molto migliori di ciò che gli oggetti vincolanti sono utili per ...
Altri suggerimenti
Gli oggetti vincolanti sono utili quando si desidera valutare modelli ERB.
Dai un'occhiata a http://www.seaside.st/ , è un'applicazione web smalltalk struttura. Usa estese continuazioni. Il miglior esempio del mondo reale su come usarlo, è questo CMS http://www.cmsbox.com/en / cms