Без лишних слов, я представляю вам долгожданную вторую часть моей серии из трех частей о циклическом просмотре коллекций в ruby. Как я писал в своей предыдущей статье здесь, эта серия из трех частей предназначена для того, чтобы служить простым обзором трех (почти) методов класса перечислителя, с которыми я часто сталкиваюсь при работе с коллекциями и манипуляциями с ними (в основном массивы, но иногда и хэши). ) в Руби. Эти три метода: Сопоставить (или Собрать), Выбрать(наоборот, Отклонить) и Уменьшить (или Внедрить). Эти методы перечисления, по-видимому, наиболее широко используются при работе с коллекциями и, таким образом, важны для любого фундаментального понимания Ruby. Вообще говоря, функция Map манипулирует элементами коллекции на основе заданных параметров блока; функция Select фильтрует коллекцию на основе параметров блока и возвращает новый массив на основе этих фильтров; метод Reduce возвращает новое значение, объединяющее элементы коллекции на основе параметров блока. И просто для ясности, когда я говорю параметры блока, я имею в виду следующее:

{|item| block }
Where the "item" refers to each element of the collection, and the "block" is the what is actually "being done" to each element in the array

Этот пост посвящен методам Select и Reject. Я приведу несколько примеров того, как можно использовать эти методы, но сначала давайте начнем с некоторых массивов, которыми нужно манипулировать:

Понятно? Хорошо. Начнем с некоторых фрагментов кода.

Это довольно простая вещь. Опять же, |x| — это блочная переменная, представляющая каждый элемент массива в данном «цикле» по массиву. |x|может называться как угодно программисту; Я использую |x| для краткости, но опять же, я мог бы заменить |x| на |supercalifragilisticexpialidocious| и все равно работать точно так же (хотя технически это сделало бы программу немного медленнее). В моем примере |x| равно «1» на первой итерации, «5» на второй и т. д. аргумент блока, который передается каждому элементу, равен x.even?; таким образом, каждая итерация по массиву будет проверять, является ли x четным (even? — это метод открытого экземпляра, и, как это обычно бывает в ООП/программировании на Ruby, ? в конце означает, что метод возвращает логическое значение (true/false)). Результирующий новый(это важно! Исходный массив массив НЕ изменяется!) массив равен [12]. Вторая строка, в которой используется reject, выполняет почти идентичную операцию; здесь метод возвращает новый массив, включающий все элементы исходного массива, которые не делятся на три.

Давайте перейдем к другому фрагменту, который включает в себя пример Регулярных выражений Ruby:

В Ruby Регулярное выражение — это «специальная последовательность символов, которая помогает вам сопоставлять или находить другие строки или наборы строк, используя специальный синтаксис, хранящийся в шаблоне». (Tutorialspoint.com) Аргумент блока здесь x =~ /[abiou]/ — пример синтаксиса регулярного выражения. Как вы, наверное, догадались, новый массив, возвращаемый этим методом, содержит любой элемент исходного массива, соответствующий любому из символов in[abiou]; в данном случае символы представляют собой строки «a» и «b».

Выбрать и Отклонить также можно использовать с хэшами. Как видно из приведенного выше фрагмента кода, блочные элементы и параметры почти идентичны тем, которые используются при манипулировании массивами, с добавлением второго переданного блочного элемента (хэши, конечно, имеют как ключи, так и значения; таким образом, при переборе хэши, оба должны быть включены как элементы блока).

Итак, как бы мы выполнили ту же функцию без использования методов Select и Reject? Один из лучших способов концептуально понять методы Ruby — это «переписать» их; другими словами, хорошей практикой является написание цикла, который дает тот же конечный результат без использования этих встроенных методов. Вот два примера (оба написаны с использованием немного сокращенного синтаксиса);

Обе эти функции вернут [12]. Первая функция использует однострочное сокращение if then else end, в отличие от его многострочного эквивалента; вторая функция использует тернарный оператор для выполнения той же задачи.

Так вот что! Краткая заметка о Bang! Методы (взято из предыдущего поста):

Это было краткое введение в методы Select/Reject. В качестве последнего примечания я добавлю следующее: «метод» bang(!) можно добавить в конец карты или собрать (например, word_array.map!), но будьте осторожны! Этот метод взрыва уникален тем, что он фактически изменяет исходный массив на новый, как указано в аргументе блока. Во всех этих предыдущих примерах создавалась новая «копия» массива, оставляя исходный массив без изменений. Взрыв! метод удалит и обновит исходный массив. Это может быть довольно рискованно, особенно если этот массив манипулируют с треском! метод также упоминается в другом месте в блоке кода. Поэтому я бы сказал, чтобы использовать взрыв! метод экономно и разумно.

Увидимся в следующий раз на Reduce/Inject!