Pensez-y de cette façon:
Méthode 1: Seul au moment de l'exécution
Si vous exécutez Ruby une fois sur votre programme en ligne droite à travers vous permet de contrôler l'ensemble du système et vous pouvez tenir sur un "pointeur de votre méthode" via la "méthode.appel". Tout ce que vous faites est maintenant sur une poignée de vivre "code" que vous pouvez exécuter chaque fois que vous le souhaitez. C'est fondamentalement aussi vite que l'appel de la méthode à partir de l'intérieur de l'objet (il pourrait effectivement être plus rapide que je ne l'ai pas testé).
Méthode 2: Persistent nom de la méthode à la base de données
Mais que faire si vous voulez stocker le nom de la méthode que vous voulez l'appeler, dans une base de données et dans une future application que vous souhaitez appeler le nom de la méthode en regardant dans la base de données? Ensuite, vous utilisez la deuxième approche, qui provoque ruby pour appeler une méthode arbitraire nom à l'aide de votre deuxième "s.envoyer(:dynamic_method)" approche.
Méthode 3: Auto-modifiant le code de la méthode
Que faire si vous voulez écrire/modifier/persistent code à une base de données d'une manière qui va exécuter la méthode comme la marque d'un nouveau code? Vous pourriez périodiquement modifier le code écrit à la base de données et souhaitez exécuter en tant qu'nouveau code à chaque fois. Dans ce (très rare cas) que vous souhaitez utiliser votre troisième approche, qui permet d'écrire votre code de la méthode comme une chaîne de caractères, de le charger de nouveau à une date ultérieure, et l'exécuter dans son intégralité.
Pour ce que ça vaut, il est généralement considéré dans l'Ruby monde comme de la mauvaise forme à utiliser Eval (méthode 3) sauf dans de très, très ésotérique et de rares cas. Donc, vous devriez vraiment coller avec les méthodes 1 et 2 pour presque tous les problèmes que vous rencontrez.