Ruby/Идеология: различия между версиями

Содержимое удалено Содержимое добавлено
Строка 479:
Очень часто приходится слышать, что "Ruby — нетипизирован". Это очень распространенное заблуждение основано на том, что все переменные в Ruby имеют одинаковый тип: <code>Object</code>. По существу, это означает отключение контроля типов, а не отсутствие типизации. Ruby, по прежнему, остается строготипизированным языком программирования. В виду засилия различных [[w:Си (язык программирования)|Си]]-подобных языков программирования, у многих программистов укоренился в сознании тот факт, что типизация переменных — неотъемлемая часть типизации вообще. Догадаться о том, что именно значение, а не переменная определяют тип, многим не судьба. К тому же, многие даже не догадываются о том, что программа может быть написана без переменных вообще.
 
Вот именно отсутствие контроля за типом переменной и открывает перед программистом богатые возможности. Ведь не нужно плодить шаблоны{{ref|ShabonsShablons}}, достаточно написать абстрактный код с переменными, значение и тип которых будут понятны позже. Ведь, программист с самого начала мало представляет облик будущей программы. Это лишь с опытом приходит способность моделировать полностью фукциональный код еще до его написания. А по молодости лет приходится пробовать и ошибаться. Необходимость же контролировать еще и типы переменных, вносит еще большую неразбериху в процесс программирования. Устранив обязательный контроль типов переменных можно существенно упростить жизнь программисту и повысить скорость написания кода.
 
В Ruby можно определить тип получаемых данных по методам, которые были вызваны для получения этих данных. Например, метод <code>.join</code> со 100% вероятностью формирует объект класса <code>String</code> (строка), а методы <code>.scan</code> и <code>.split</code> — объект типа <code>Array</code> (массив). Но это не всегда работает, так как есть методы, которые есть у нескольких классов и, в зависимости от класса, они возвращают объект того или иного класса. Не могу привести пример таких методов, но вполне допускаю, что они могут быть{{ref|Research}}. Контроль за классом объекта, через вызываемые от него методы, в Ruby называется "Утиным контролем типов". "Утиный" потому, что если объект "крякает как утка, то он и является уткой!". Иными словами, если методы, которые мы хотим вызвать, успешно вызвались, то класс исходного объекта не важен. Остается подобрать такую последовательность методов, которая дает верный результат. От том, насколько просто или сложно это реализовать — вопрос отдельный. Могу лишь поделиться своим наблюдением, что первым в последовательности методов ставят метод-адаптер, который конвертирует объект в необходимый для второго метода класс. А дальше все проходит по заведомо определенному маршруту преобразований.