класс Enumerator::Chain
Enumerator::Chain — это подкласс Enumerator, представляющий цепочку перечисляемых объектов, работающих как единый перечислитель.
Этот тип объектов можно создать с помощью Enumerable#chain и Enumerator#+.
Публичные методы класса
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
Публичные методы экземпляра
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_funcall_with_block(RARRAY_AREF(enums, i), id_each, argc, argv, block);
}
return obj;
} Итерируется по элементам первого перечисляемого объекта, вызывая метод «each» на нём с заданными аргументами, затем переходит к следующим перечисляемым объектам последовательно, пока все перечисляемые объекты не будут исчерпаны.
Если блок не задан, возвращает перечислитель.
static VALUE
enum_chain_inspect(VALUE obj)
{
return rb_exec_recursive(inspect_enum_chain, obj, 0);
} Возвращает удобочитаемый вид цепочки перечислителя.
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» на каждом перечисляемом объекте в обратном порядке. Каждый вызов выполняется только в том случае, если перечисляемый объект отвечает методу.
static VALUE
enum_chain_size(VALUE obj)
{
return enum_chain_total_size(enum_chain_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.