«Перегрузка» - это термин, который просто не имеет смысла в Ruby.По сути, это синоним «статической диспетчеризации на основе аргументов», но у Ruby нет статической диспетчеризации вообще .Итак, причина, по которой Ruby не поддерживает статическую диспетчеризацию на основе аргументов, заключается в том, что она не поддерживает статическую диспетчеризацию, точка.Он не поддерживает статическую диспетчеризацию любого вида , основанную на аргументах или иным образом.
Теперь, если вы не на самом деле конкретно спрашиваете о перегрузке, но, возможно,о динамической диспетчеризации на основе аргументов, тогда ответ таков: потому что Мац не реализовал это.Потому что никто не удосужился предложить это.Потому что никто не удосужился его реализовать.
В общем, динамическая диспетчеризация на основе языка в языке с необязательными аргументами и списками аргументов переменной длины, очень трудно получить правильно, и даже сложнее чтобы было понятно.Даже в языках с static диспетчеризацией на основе аргументов и без дополнительных аргументов (например, Java) иногда почти невозможно сказать для простого смертного, , какая перегрузка будетбыть выбранным.
В C # вы можете фактически кодировать любую проблему 3-SAT в разрешение перегрузки, что означает, что разрешение перегрузки в C # является NP-сложным.
Теперь попробуйте это с динамическая диспетчеризация, где у вас есть дополнительное измерение времени, которое нужно держать в голове.
Существуют языки, которые динамически диспетчеризуются на основе всех аргументов процедуры, в отличие от объектно-ориентированных языков,который отправляется только по «скрытому» аргументу нулевого self
.Common Lisp, например, отправляет динамические типы и даже динамические значения всех аргументов.Clojure отправляет произвольную функцию всех аргументов (что, кстати, очень круто и чрезвычайно мощно).
Но я не знаю ни одного языка OO с динамической диспетчеризацией на основе аргументов.Мартин Одерски сказал, что он может подумать о добавлении диспетчеризации на основе аргументов в Scala, но только , если он может снять перегрузку одновременно, и будут обратно совместимы какс существующим кодом Scala, который использует перегрузку и совместим с Java (он особо упомянул Swing и AWT, которые разыгрывают несколько чрезвычайно сложных трюков, выполняя практически все неприятные темные ситуации с довольно сложными правилами перегрузки Java).У меня были некоторые идеи по поводу добавления рассылки на основе аргументов в Ruby, но я никогда не мог придумать, как это сделать обратно совместимым образом.