Spec-Zone.ru › Ruby 2.6

класс Enumerator::Chain

Родитель:
Enumerator

Enumerator::Chain — подкласс Enumerator, представляющий цепочку перечисляемых объектов, работающую как один перечислитель.

Этот тип объектов можно создать с помощью Enumerable#chain и Enumerator#+.

Публичные методы класса

Enumerator::Chain.new(*enums) → enum Показать исходный код
static VALUE
enum_chain_initialize(VALUE obj, VALUE enums)
{
    struct enum_chain *ptr;

    rb_check_frozen(obj);
    TypedData_Get_Struct(obj, struct enum_chain, &enum_chain_data_type, ptr);

    if (!ptr) rb_raise(rb_eArgError, "unallocated chain");

    ptr->enums = rb_obj_freeze(enums);
    ptr->pos = -1;

    return obj;
}

Создаёт новый объект перечислителя, который итерирует по элементам переданных перечислимых объектов последовательно.

e = Enumerator::Chain.new(1..3, [4, 5])
e.to_a #=> [1, 2, 3, 4, 5]
e.size #=> 5

Публичные методы экземпляра

each(*args) { |...| ... } → obj Показать исходный код
each(*args) → enumerator
static VALUE
enum_chain_each(int argc, VALUE *argv, VALUE obj)
{
    VALUE enums, block;
    struct enum_chain *objptr;
    long i;

    RETURN_SIZED_ENUMERATOR(obj, argc, argv, argc > 0 ? enum_chain_enum_no_size : enum_chain_enum_size);

    objptr = enum_chain_ptr(obj);
    enums = objptr->enums;
    block = rb_block_proc();


    for (i = 0; i < RARRAY_LEN(enums); i++) {
        objptr->pos = i;
        rb_block_call(RARRAY_AREF(enums, i), id_each, argc, argv, enum_chain_yield_block, block);
    }

    return obj;
}

Итерирует по элементам первого перечислимого объекта, вызывая метод «each» с заданными аргументами, затем переходит к следующим перечислимым объектам в последовательности, пока все перечислимые объекты не будут исчерпаны.

Если блок не задан, возвращает перечислитель.

inspect → строка Показать исходный код
static VALUE
enum_chain_inspect(VALUE obj)
{
    return rb_exec_recursive(inspect_enum_chain, obj, 0);
}

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

rewind → obj Показать исходный код
static VALUE
enum_chain_rewind(VALUE obj)
{
    struct enum_chain *objptr = enum_chain_ptr(obj);
    VALUE enums = objptr->enums;
    long i;

    for (i = objptr->pos; 0 <= i && i < RARRAY_LEN(enums); objptr->pos = --i) {
        rb_check_funcall(RARRAY_AREF(enums, i), id_rewind, 0, 0);
    }

    return obj;
}

Возвращает перечислитель цепочки, вызывая метод «rewind» на каждом перечислимом объекте в обратном порядке. Каждый вызов выполняется только в том случае, если перечислимый объект отвечает на этот метод.

size → целое число, Float::INFINITY или nil Показать исходный код
static VALUE
enum_chain_size(VALUE obj)
{
    return enum_chain_total_size(enum_chain_ptr(obj)->enums);
}

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

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

Spec-Zone.ru

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