класс Enumerator::Product
Enumerator::Product генерирует декартово произведение любого количества перечисляемых объектов. Итерация по произведению перечисляемых объектов примерно эквивалентна вложенным циклам each_entry, где цикл для правого объекта помещается в самую внутреннюю часть.
innings = Enumerator::Product.new(1..9, ['top', 'bottom']) innings.each do |i, h| p [i, h] end # [1, "top"] # [1, "bottom"] # [2, "top"] # [2, "bottom"] # [3, "top"] # [3, "bottom"] # ... # [9, "top"] # [9, "bottom"]
Метод, используемый для каждого перечисляемого объекта, — «each_entry», а не «each», поэтому произведение N перечисляемых объектов даёт массив ровно из N элементов в каждой итерации.
Если перечисляемый объект не задан, вызывается заданный блок один раз, передавая пустой список аргументов.
Этот тип объектов можно создать с помощью Enumerator.product.
Публичные методы класса
static VALUE
enum_product_initialize(int argc, VALUE *argv, VALUE obj)
{
struct enum_product *ptr;
VALUE enums = Qnil, options = Qnil;
rb_scan_args(argc, argv, "*:", &enums, &options);
if (!NIL_P(options) && !RHASH_EMPTY_P(options)) {
rb_exc_raise(rb_keyword_error_new("unknown", rb_hash_keys(options)));
}
rb_check_frozen(obj);
TypedData_Get_Struct(obj, struct enum_product, &enum_product_data_type, ptr);
if (!ptr) rb_raise(rb_eArgError, "unallocated product");
ptr->enums = rb_obj_freeze(enums);
return obj;
} Генерирует новый объект перечислителя, который генерирует декартово произведение заданных перечисляемых объектов.
e = Enumerator::Product.new(1..3, [4, 5]) e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]] e.size #=> 6
Публичные методы экземпляра
static VALUE
enum_product_each(VALUE obj)
{
RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_product_enum_size);
return enum_product_run(obj, rb_block_proc());
} Итерируется по элементам первого перечисляемого объекта, вызывая метод «each_entry» с заданными аргументами, а затем переходит к следующим перечисляемым объектам в последовательности, пока не будут исчерпаны все перечисляемые объекты.
Если блок не задан, возвращает перечислитель. В противном случае возвращает self.
static VALUE
enum_product_inspect(VALUE obj)
{
return rb_exec_recursive(inspect_enum_product, obj, 0);
} Возвращает печатную версию перечислителя произведения.
static VALUE
enum_product_rewind(VALUE obj)
{
struct enum_product *ptr = enum_product_ptr(obj);
VALUE enums = ptr->enums;
long i;
for (i = 0; i < RARRAY_LEN(enums); i++) {
rb_check_funcall(RARRAY_AREF(enums, i), id_rewind, 0, 0);
}
return obj;
} Перематывает перечислитель произведения, вызывая метод «rewind» для каждого перечисляемого объекта в обратном порядке. Каждый вызов выполняется только в том случае, если перечисляемый объект отвечает на этот метод.
static VALUE
enum_product_size(VALUE obj)
{
return enum_product_total_size(enum_product_ptr(obj)->enums);
} Возвращает общий размер произведения перечислителей, вычисленный путём умножения размеров перечисляемых объектов в произведении. Если какой-либо из перечисляемых объектов сообщает свой размер как nil или Float::INFINITY, это значение возвращается в качестве размера.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.