В Ruby вы можете использовать классы и методы, как если бы они были значениями без особой работы, таким образом, вы можете уменьшить объем, которым вы фактически должны управлять в своем примере, до единого определения Class -> Method и использовать обобщенный алгоритм для работать с этим определением.
Предположим, что каждый из ваших типов реализует указанные вами методы, например, Apple.bite (), Banana.peel () и Cherry.om_nom_nom () определены. Также предположим, что fruit является экземпляром fruit_kind . Вы можете управлять отображением в одном месте и использовать обобщенный метод для выполнения всей оценки метода, относящейся к классу, например:
fruit_table = {Apple => :bite,
Banana => :peel,
Cherry => :om_nom_nom}
eating_method = fruit.method(fruit_table[fruit.type])
eating_method.call
Обратите внимание, что ссылка eat_method является экземпляром объекта метода, определенного для экземпляра fruit. Вы можете извлечь определение таблицы как переменную класса, но вы захотите оценивать fruit.method в контексте каждого решения о том, какую функцию вызывать в передаваемом вами экземпляре.