类 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_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
公共实例方法
源代码
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,则该值将作为总大小返回。