Spec-Zone.ru › Ruby 3.4

класс Enumerator::Product

Родитель:
Enumerator

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.

Общедоступные методы класса

Enumerator::Product.new(*enums) → enum
Исходный код
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_ary_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

Общедоступные методы экземпляра

each { |...| ... } → obj
each → enumerator
Исходный код
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.

inspect → строка
Исходный код
static VALUE
enum_product_inspect(VALUE obj)
{
    return rb_exec_recursive(inspect_enum_product, obj, 0);
}

Возвращает удобочитаемую версию перечислителя произведения.

rewind → obj
Исходный код
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» для каждого перечисляемого объекта в обратном порядке. Вызов выполняется только если перечисляемый объект отвечает методу.

size → целое число, Float::INFINITY или nil
Исходный код
static VALUE
enum_product_size(VALUE obj)
{
    return enum_product_total_size(enum_product_ptr(obj)->enums);
}

Возвращает общий размер произведения перечислителей, вычисленный путём умножения размеров перечисляемых объектов в произведении. Если размер любого из перечисляемых объектов равен nil или Float::INFINITY, возвращается это значение.

Ruby Core © 1993–2024 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API