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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top