Магия модуля Enumerable в Ruby: #3 Условные Операторы
января 15, 2011 | Published in Ruby, Основы | 2 Comments
Статьи из цикла Магия модуля Enumerable:
1.Основы
2. Унарный оператор амперсанд “&”
3. Условные операторы
4. Фильтры
5. Создание новых коллекций
6. Методы inject, min и max
Самые основные методы модуля Enumerable это те, которые дают простой ответ да или нет. Существует три таких условных метода: all? , any? и include?. каждый из этих методов предоставляют вам информацию о коллекции с которой вы работаете.
Начнем изучение их работы на основе следущего кода:
class Team include Enumerable attr_accessor :members def initialize @members = [] end def each &block @members.each{|member| block.call(member)} end end
Метод all?
Этот метод сообщает вам о том, все ли элементы коллекции соответствуют указанному вами критерию. Давайте проверим работу метода all? на практике:
team = Team.new team.members = ['joshua', 'gabriel', 'jacob'] team.all?{|member| member.length > 4} #=> true team.all?{|member| member.length > 5} #=> false
Здесь мы проверяем все ли участники (members) обладают именами определенной длины. Все имена имеют более четырех символов, поэтому метод all? вернет значение true. Однако только два из трех имен содержат более пяти символов, благодаря чему во втором случае метод all? вернет значение false.
Независимо от блока, который вы передаете, метод all? будет оценивать каждое значение в коллекции (в нашем случае это массив members) и вернет значение true только в том случае, когда все элементы коллекции соответствуют условию, т.е. возвращают true.
Метод any?
all? слишком строг, требуя соответствие всех элементов условию. Что если нам необходимо знать соответствует ли хотя бы один элемент коллекции условию? Представьте, как Бог в комнате распределения душ спрашивает у отъявленного грешника сделал ли тот хоть один хороший поступок. Грешник вспоминает все свои поступки и ищет хотя бы один хороший. Это очень хорошо иллюстрирует работу метода any?. Но для пущего понимания материала давайте рассмотрим примеры работы метода any? в реальном коде:
require 'team.rb' team = Team.new team.members = ['joshua', 'gabriel', 'jacob'] team.any?{|member| member == 'joshua'} #=> true team.any?{|member| member == 'javier'} #=> false
Пример выше иллюстрирует вечеринку, на которую сходятся все ваши друзья и приглашают своих друзей. В первом случае к вам в звонок звонят трое молодых людей и один из них ваш друг Джошуа, значит остальные двое пришли по его приглашению. У вас есть еще один друг Хавьер, который так же должен был прийти с друзьями. И вот вы слышите звонок, открываете дверь, и перед вами стоит три человека. Поскольку среди них нет вашего друга Хавьера, то эти люди не знакомы вам и сами напрашиваются на вечеринку, следовательно, вы их не пускаете к себе домой. Из примера видно, что метод any? возвращает значение true, если хотя бы один член коллекции соответствует заданному условию.
Метод include?
Это мой любимый условный метод из модуля Enumerable, просто потому, что я всегда забываю как его записывать. Мне всегда хочется написать includes? когда имя коллекции находится в едином числе (например, team). Однако это имеет смысл, когда имя коллекции во множественном числе, как, например в случае с members.include?.
Пример используемый выше (с any?) может быть сокращен благодаря использованию include?:
require 'team.rb' team = Team.new team.members = ['joshua', 'gabriel', 'jacob'] team.include?('joshua') #=> true team.include?('javier') #=> false
В первую очередь обратите внимание и запомните то, что в include? не передается блок, вместо этого include? необходим лишь один параметр — элемент коллекции. Метод include? просматривает всю коллекцию на наличие в ней переданного в качестве аргумента элемента коллекции. В примере выше мы проверяем, есть ли в списке участников, в первом случае, человек по имени Джошуа, а во втором случае, человек по имени Хавьер. Если соответствующий элемент будет найден в коллекции, то метод include? вернет значение true?, в противном случае мы получим значение false.
Оригинал статьи на английском:
Лучшаяблагодарность автору блога — ваши комментарии!
января 15, 2011 at 18:28 (#)
Спасибо, очень доступно все написано. Все больше влюбляюсь в Ruby
января 15, 2011 at 21:59 (#)
для меня после PHP, Ruby как откровение =) Очень изящный, удобный и быстро развивающийся язык.