class Enumerator::Chain
Enumerator::Chain 是 Enumerator 的一个子类,它表示一个可枚举对象的链,作为一个单一的枚举器工作。
这类对象可以通过 Enumerable#chain 和 Enumerator#+ 创建。
Public Class Methods
Source
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");
RB_OBJ_WRITE(obj, &ptr->enums, rb_ary_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
Public Instance Methods
Source
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”方法来迭代其元素,然后按顺序处理接下来的可枚举对象,直到所有可枚举对象都被耗尽。
如果没有给出块,则返回一个枚举器。
Source
static VALUE
enum_chain_inspect(VALUE obj)
{
return rb_exec_recursive(inspect_enum_chain, obj, 0);
}
返回枚举器链的可打印版本。
Source
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”方法来倒转枚举器链。每次调用仅在可枚举对象响应该方法时执行。
Source
static VALUE
enum_chain_size(VALUE obj)
{
return enum_chain_total_size(enum_chain_ptr(obj)->enums);
}
返回枚举器链的总大小,该大小通过对链中每个可枚举对象的大小进行求和来计算。如果任何可枚举对象的大小报告为 nil 或 Float::INFINITY,则该值将作为总大小返回。