J'utilise Blockenspiel pour créer un DSL avec Ruby. Il fonctionne très bien et résout beaucoup de mes problèmes, mais j'ai rencontré le problème suivant qui n'est pas strictement lié à Blockenspiel.Est-il possible d'évaluer un Ruby DSL dans un contexte non global?
Supposons que j'ai un DSL qui ressemble à ceci:
dish do
name = 'Pizza'
ingredients = ...
nutrition_facts = ...
end
dish do
name = 'Doner'
ingredients = ...
nutrition_facts = ...
end
Maintenant, j'ai un compilateur de menu qui prend les plats et les compile en un menu. Le compilateur devrait maintenant être capable de compiler plusieurs fichiers de menu, afin qu'il ait installé et effacer un contexte global. Cela devrait de préférence se produire en parallèle.
Je trouve que sinatra utilise des variables de classe, mais cela a pour conséquence qu'il ne peut faire un traitement séquentiel et que vous devez effacer les variables de classe lorsque vous voulez compiler un nouveau menu . Une alternative serait d'utiliser des variables globales.
Je préférerais évaluer les méthodes DSL dans le cadre d'un objet , de sorte qu'il n'y a pas de contexte global et je pouvais compiler les menus en parallèle, mais la dernière fois que j'ai essayé, je rencontré quelques problèmes lorsque déclarer des méthodes (helper-) dans le fichier de menu.
Quels sont les procédés possibles? Quelle est la manière recommandée de faire ceci?
Puis-je également déclarer de nouvelles fonctions et les utiliser dans un menu pendant son évaluation? –
Oui. 'instance_eval', agissant comme un bloc, vous permet de définir des classes, des modules et des méthodes à l'intérieur. – BaroqueBobcat