Мой основной язык статически типизирован (Java). В Java вы должны возвращать один тип из каждого метода. Например, у вас не может быть метода, который условно возвращает String
или условно возвращает Integer
. Но в JavaScript, например, это очень возможно.
На статически типизированном языке я понимаю, почему это плохая идея. Если возвращается каждый метод Object
(общий родительский элемент, от которого наследуются все классы), то вы и компилятор понятия не имеете, с чем имеете дело. Вы должны будете обнаружить все свои ошибки во время выполнения.
Но в динамически типизированном языке может даже не быть компилятора. В динамически типизированном языке для меня не очевидно, почему функция, которая возвращает несколько типов, является плохой идеей. Мой опыт работы со статическими языками заставляет меня избегать написания таких функций, но я боюсь, что я слишком внимателен к функции, которая может сделать мой код чище так, как я его не вижу.
Изменить : я собираюсь удалить свой пример (пока я не могу придумать лучшего). Я думаю, что это заставляет людей отвечать на вопрос, который я не пытаюсь сделать.
(coerce var 'string)
выходы a string
или (concatenate 'string this that the-other-thing)
аналогично. Я написал такие вещи, ThingLoader.getThingById (Class<extends FindableThing> klass, long id)
как хорошо. И там я могу вернуть только то, что подклассы того, что вы просили: loader.getThingById (SubclassA.class, 14)
может вернуть то, SubclassB
что расширяется SubclassA
...