类 Enumerator::Chain

Enumerator::ChainEnumerator 的子类,它表示一个可枚举对象的链,作为一个单独的可枚举对象工作。

这种类型的对象可以通过 Enumerable#chainEnumerator#+ 创建。

公共类方法

Enumerator::Chain.new(*enums) → enum 点击切换源代码

生成一个新的可枚举对象,它按顺序迭代给定可枚举对象的元素。

e = Enumerator::Chain.new(1..3, [4, 5])
e.to_a #=> [1, 2, 3, 4, 5]
e.size #=> 5
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;
}

公共实例方法

each(*args) { |...| ... } → obj 点击切换源代码
each(*args) → enumerator

通过对第一个可枚举对象调用“each”方法(使用给定的参数)来迭代其元素,然后按顺序继续到后续的可枚举对象,直到所有可枚举对象都耗尽。

如果没有给出代码块,则返回一个可枚举对象。

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;
}
inspect → string 点击切换源代码

返回可枚举链的可打印版本。

static VALUE
enum_chain_inspect(VALUE obj)
{
    return rb_exec_recursive(inspect_enum_chain, obj, 0);
}
rewind → obj 点击切换源代码

通过按相反顺序对每个可枚举对象调用“rewind”方法来倒带可枚举链。只有当可枚举对象响应该方法时才会执行每个调用。

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;
}
size → int, Float::INFINITY or nil 点击切换源代码

返回通过将链中每个可枚举对象的大小加起来计算的可枚举链的总大小。如果任何可枚举对象报告其大小为 nil 或 Float::INFINITY,则该值将作为总大小返回。

static VALUE
enum_chain_size(VALUE obj)
{
    return enum_chain_total_size(enum_chain_ptr(obj)->enums);
}