類別 Enumerator::Chain
Enumerator::Chain
是 Enumerator
的子類別,代表一個可作為單一列舉器的列舉器鏈。
此類型的物件可以由 Enumerable#chain
和 Enumerator#+
建立。
公開類別方法
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); }