8.3.3. Метод partition
8.3.3. Метод partition
Как говорится, «в мире есть два сорта людей: те, что делят людей по сортам, и те, что не делят». Метод partition относится не к людям (хотя мы можем представить их в Ruby как объекты), но тоже делит набор на две части.
Если при вызове partition задан блок, то он вычисляется для каждого элемента набора. В результате создаются два массива: в первый попадают элементы, для которых блок вернул значение true, во второй — все остальные. Метод возвращает массив, двумя элементами которого являются эти массивы.
nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
odd_even = nums.partition {|x| x % 2 == 1 }
# [[1,3,5,7,9],[2,3,4,6,8]]
under5 = nums.partition {|x| x < 5 }
# [[1,2,3,4],[5,6,7,8,9]]
squares = nums.partition {|x| Math.sqrt(x).to_i**2 == x }
# [[1,4,9], [2,3,5,6,7,8]]
Если нужно разбить набор больше чем на две группы, придется написать собственный метод. Я назвал его classify по аналогии с методом из класса Set.
module Enumerable
def classify(&block)
hash = {}
self.each do |x|
result = block.call(x)
(hashfresult] ||= []) << x
end
hash
end
end
nums = [1,2,3,4,5,6,7,8,9]
mod3 = nums.classify {|x| x % 3 }
# { 0=>[3,6,9], 1=>[1,4,7], 2=>[2,5,8] }
words = %w( area arboreal brick estrous clear donor ether filial
patina ]
vowels = words.classify {|x| x.count("aeiou") }
# {1=>["brick"], 2=>["clear", "donor", "ether"],
# 3=>["area", "estrous", "filial", "patina"], 4=>["arboreal"]}
initials = words.classify {|x| x[0..0] }
# {"a"=>["area", "arboreal"], "b"=>["brick"], "c"=>["clear"],
# "d"=>["donor"], "p"=>["patina"], "e"=>["estrous", "ether"],
# "f"=>["filial"]}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
Метод Run
Метод Run Параметр intWindowStyle устанавливает вид окна для запускаемого приложения (табл. 1.13).Таблица 1.13. Типы окна (intWindowStyle) Параметр Константа Visual Basic Описание 0 vbHide Прячет текущее окно и активизирует другое окно (показывает его и передает ему фокус) 1 vbNormalFocus Активизирует и
Метод Move
Метод Move Обязательный параметр destination определяет каталог, в который будет производиться перемещение; групповые символы в имени каталога недопустимы. Замечание Вместо метода Move можно использовать метод MoveFolder объекта
Метод Copy
Метод Copy Обязательный параметр destination определяет файл, в который будет производиться копирование; групповые символы в имени файла недопустимы.Параметр overwrite является логической переменной, определяющей, следует ли заменять уже существующий файл с именем destination (overwrite=true)
Метод Delete
Метод Delete Если параметр force равен false или не указан, то с помощью метода Delete будет нельзя удалить файл с атрибутом "только для чтения" (read-only). Установка для force значения true позволит сразу удалять такие файлы. Замечание Вместо метода Delete можно использовать метод DeleteFile
Метод Move
Метод Move Обязательный параметр destination определяет файл, в который будет производиться перемещение; групповые символы в имени файла недопустимы. Замечание Вместо метода Move можно использовать метод MoveFile объекта
11.1.10. Метод initialize_copy
11.1.10. Метод initialize_copy При копировании объекта методом dup или clone конструктор не вызывается. Копируется вся информация о состоянии.Но что делать, если вам такое поведение не нужно? Рассмотрим пример:class Document attr_accessor :title, :text attr_reader :timestamp def initialize(title, text) @title, @text = title, text @timestamp =
11.1.11. Метод allocate
11.1.11. Метод allocate Редко, но бывает, что нужно создать объект, не вызывая его конструктор (в обход метода initialize). Например, может статься, что состояние объекта полностью определяется методами доступа к нему; тогда не нужно вызывать метод new (который вызовет initialize), разве что вы
11.3.2. Метод const_get
11.3.2. Метод const_get Метод const_get получает значение константы с заданным именем из модуля или класса, которому она принадлежит.str = "PI"Math.const_get(str) # Значение равно Math::PI.Это способ избежать обращения к методу eval, которое иногда считается неэлегантным. Такой подход дешевле с точки
11.3.5. Метод define_method
11.3.5. Метод define_method Помимо ключевого слова def, единственный нормальный способ добавить метод в класс или объект — воспользоваться методом define_method, причем он позволяет сделать это во время выполнения.Конечно, в Ruby практически все происходит во время выполнения. Если
11.3.6. Метод const_missing
11.3.6. Метод const_missing Метод const_missing аналогичен методу method_missing. При попытке обратиться к неизвестной константе вызывается этот метод — если он, конечно, определен. В качестве параметра ему передается символ, ссылающийся на константу.Чтобы перехватывать обращения к
Partition Magic
Partition Magic Профессиональный пакет для работы с разделами жесткого диска. Мы уже описывали кое-какие приемы работы с ним в главе, посвященной жесткому диску: Partition Magic отлично подходит для создания разделов на вашем винчестере и форматирования диска, это он делает гораздо
Алгоритм partition()
Алгоритм partition() template class BidirectionalIterator, class UnaryPredicate BidirectionalIteratorpartition(BidirectionalIterator first,BidirectionalIterator last, UnaryPredicate pred );partition() переупорядочивает элементы в диапазоне [first,last). Все элементы, для которых предикат pred равен true, помещаются перед элементами, для которых он равен false.
Метод Sorted
Метод Sorted Описание методовМетоды приведены для последовательности sequence of T. function Sorted(): sequence of T; Возвращает отсортированную по возрастанию
Метод Zip
Метод Zip Описание методовМетоды приведены для последовательности sequence of T. function Zip<TSecond,Res>(second: sequence of TSecond; resultSelector: (T,TSecond)->Res): sequence of Res; Объединяет две последовательности, используя указанную функцию, принимающую по одному элементу каждой последовательности и
Метод Contains
Метод Contains Описание методовМетоды приведены для последовательности sequence of T. function Contains(value: T): boolean; Определяет, содержится ли указанный элемент в последовательности, используя компаратор проверки на равенство по умолчанию. function Contains(value: T; comparer: IEqualityComparer<T>): boolean;