Я бы не рекомендовал этот конкретный подход, так как вы не можете разместить классы, которые предоставляют хэш или семантику массива, но не являются этим классом. Если вам нужна такая проверка, лучше использовать respond_to?
с именем метода. Массивы реализуют метод: [], для чего это стоит.
OpenStruct имеет семантику хэша и семантику метода доступа к атрибуту, но не вернет true для условия hash.class==Hash
. Хотя на практике это будет работать как хеш.
Если рассматривать это в перспективе, даже на не динамическом языке вы не захотите делать это таким образом; Вы бы предпочли проверить, что объект реализует IDictionary<T>
. Ruby идиотически предпочел бы, чтобы при необходимости вы проверяли, что метод существует, потому что если это так, разработчик, вероятно, намеревается, чтобы их объект действовал одинаково. Вы можете обеспечить дополнительную работоспособность с помощью модульных тестов вокруг клиентского кода в качестве альтернативы принуждению вещей к нединамичности.