Что ж, все согласны с тем, что когда объект передается в Ruby, он не проверяется типом. Интерфейсы в Java и PHP - это способ подтвердить, что объект соответствует определенному контракту или «типу» (так что что-то может быть Serializable
, Authorizable
, Sequential
и все остальное, что вы хотите).
Однако в Ruby отсутствует формализованное понятие контракта, для которого интерфейсы будут выполнять какую-то значимую роль, поскольку соответствие интерфейса не проверяется в сигнатурах методов . См. Например, Enumerable
. Когда вы смешиваете его с вашим объектом, вы используете его функциональность , в отличие от объявления , что ваш объект Enumerable
. Единственное преимущество наличия вашего объекта Enumerable
состоит в том, что, определив each(&blk)
, вы автоматически получаете map
, select
и друзей бесплатно. Вы можете прекрасно иметь объект, который реализует все методы, предоставляемые Enumerable
, но не смешивается в модуле, и он все равно будет работать.
Например, для любого метода в Ruby, который ожидает IO-объект, вы могли бы передать что-то, что не имеет ничего , связанного с IO, и тогда оно взорвалось бы с ошибкой или - если вы реализовали Заглушка ввода / вывода правильно - она будет работать нормально, даже если переданный вами объект не объявлен как "IO-ish".
Идея, лежащая в основе этого, заключается в том, что объекты в Ruby на самом деле не являются прославленными хеш-таблицами с наложенными на них тегами (которые затем имеют некоторые дополнительные теги, которые сообщают интерпретатору или компилятору, что этот объект имеет интерфейс X, поэтому он может использоваться в контексте Y), но закрытая сущность, отвечающая на сообщения. Поэтому, если объект отвечает на конкретное сообщение, он выполняет контракт, а если он не отвечает на это сообщение, то возникает ошибка.
Таким образом, отсутствие интерфейсов компенсируется частично наличием модулей (которые могут содержать функциональные возможности, к которым вы обращаетесь без выполнения каких-либо обещаний типа для вызывающего абонента / потребителя) и частично традицией передачи сообщений в отличие от типизированных диктов .
Вам следует посмотреть несколько презентаций Джима Вейриха, так как он широко затрагивает эту тему.