2009-10-22 8 views
5

Hier soir, je pensais à ce que je pense être des fonctionnalités avancées de langue ruby, à savoir les Continuations (callcc) et les objets de liaison. Je veux dire avancé parce que j'ai un fond oo langages statiquement typé (C#, Java, C++), j'ai découvert ruby ​​très récemment, donc ces fonctionnalités de langue ne me sont pas très familières.Utilisation du monde réel des objets de liaison en ruby ​​

Je me demande ce que pourrait être l'utilisation réelle de ces fonctionnalités de langages. Selon mon expérience, tout peut être fait avec des langages oo typés statiquement, mais je suis d'accord pas très intelligemment parfois. Je pense que j'ai compris la beauté/l'intérêt de Continuation lire ce bel article de Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

Encore, je suis perdu avec objet Binding. Quelqu'un peut-il me fournir des exemples concrets de quelque chose qui peut être intelligemment fait avec un objet Binding mais pas très intelligemment avec des langages qui manquent le concept Ruby Binding? Je pensais retourner certains objets à leur état initial quand quelque chose ne va pas pendant un long processus, mais je ne suis pas sûr que cela puisse être implémenté avec l'objet Binding et je pense qu'il pourrait être implémenté assez intelligemment en clonant des objets avant le traitement et le remplacement de l'objet modifié avec leurs clones lorsque quelque chose se passe mal pendant le traitement. Donc, ce n'est pas un exemple valide, je pense.

Merci d'avance pour votre aide.

Répondre

5

Je l'ai utilisé la classe de liaison pour mettre en oeuvre un hack de débogage.

class Array 
    def debug binding 
    each do |arg| 
     puts "arg = #{eval(arg, binding).inspect}" 
    end 
    end 
end 

Vous pouvez l'utiliser pour inspecter une liste des extraits de code Ruby avec ce que chaque extrait de rendement:

# .. some hairy code you want to debug ... 
['user','current_resource', 'user.owns?(current_resource)'].debug(binding) 

qui imprimera

user = #<User id:1, username: 'joe', ... 
current_resource = #<Comment id:20, ... 
user.owns?(current_resource) = false 

Je trouve très utile pour débogage rapide.

Je devais utiliser un objet de liaison pour capturer la portée où debug est appelé afin qu'il puisse être utilisé dans le eval lorsque debug est exécuté. Il y a probablement d'autres façons d'implémenter cela, mais l'utilisation de la liaison était facile et rapide. Il existe également des exemples bien meilleurs de ce que les objets de liaison sont utiles pour ...

+0

Merci! C'est juste! L'implémentation d'une fonctionnalité de débogage semble être une utilisation de l'objet Binding. Je me demande si cette fonctionnalité de débogage a été documentée comme un exemple de liaison dans le livre Pioche ou non. Pouvez-vous voir d'autres utilisations des objets Binding? –

+0

@dhruv C'est assez joli. Je pense que je vais l'ajouter à mon paquet utilitaire, juste à côté de putsv (puts si verbose) etc ... Merci! – Ryanmt

8

objets de liaison sont utiles lorsque vous souhaitez évaluer ERB templates.

+1

Pouvez-vous élaborer un peu plus? Je ne vois pas ce que tu veux dire. –

+2

@SylvainPrat: La méthode de résultat ERB # prend un objet 'Binding'. Vous pouvez l'obtenir simplement en utilisant la méthode du noyau 'binding', appelée directement comme dans' my_template.result (binding) '- qui exécute le code Ruby dans le template avec le contexte courant) –

1

Jetez un oeil à http://www.seaside.st/, c'est un cadre d'application web smalltalk. Il utilise largement les continuations. Le meilleur exemple concret sur comment l'utiliser, est ce CMS http://www.cmsbox.com/en/cms

+0

Merci pour la réponse, mais ma question était plus sur l'objet de liaison que la continuation;) –

Questions connexes