Да ... вроде. В Ruby отсутствует разумная конструкция для обеспечения неизменности. (Object#freeze
не в счет) Неизменность действительно является краеугольным камнем функциональных языков. Кроме того, основные библиотеки Ruby сильно ориентированы на императивный дизайн. Его классы Array
и Hash
являются изменяемыми по своей природе, даже String
имеет методы, которые делают неизменяемыми (например, gsub!
). По иронии судьбы, в этом отношении Java более «функциональна», чем Ruby.
С учетом вышесказанного, в Ruby возможно функционально-подобное программирование. Каждый раз, когда вы используете блок / proc / lambda, вы используете функцию, которая приходит из функционального программирования. Аналогично, методы сбора, такие как map
и zip
, также являются конструкциями более высокого порядка, которые берут свое начало в таких языках, как Lisp, ML и Haskell.
Если вы действительно хотите заниматься функциональным программированием, вам нужно использовать язык, более ориентированный на этот жанр. Некоторые предложения:
- Clojure - Поскольку вы сформулировали вопрос, используя Ruby, я предполагаю, что вы из динамически типизированного убеждения. Clojure похож на строго функциональный Lisp, который работает на JVM.
- F # - В основном OCaml на CLR. Очень красиво, очень чисто
- Scala - Не строго функциональный язык, но гораздо лучше для него, чем Ruby
- Haskell - Всеми любимые!
Вы заметите, что три из этих четырех языков статически типизированы. На самом деле, в случае Scala и Haskell это очень статически типизированных языков (гораздо более сильные системы типов, чем, скажем, Java). Я не уверен, почему это тенденция в функциональных языках, но у вас это есть.