class Enumerator::Product
Enumerator::Product erzeugt ein kartesisches Produkt beliebiger Anzahl von aufzählbaren Objekten. Das Iterieren über das Produkt von aufzählbaren Objekten ist ungefähr äquivalent zu verschachtelten each_entry-Schleifen, wobei die Schleife für das rechteste Objekt am innersten platziert ist.
innings = Enumerator::Product.new(1..9, ['top', 'bottom']) innings.each do |i, h| p [i, h] end # [1, "top"] # [1, "bottom"] # [2, "top"] # [2, "bottom"] # [3, "top"] # [3, "bottom"] # ... # [9, "top"] # [9, "bottom"]
Die Methode, die gegen jedes aufzählbare Objekt verwendet wird, ist „each_entry` anstelle von `each`, sodass das Produkt von N aufzählbaren Objekten ein Array von genau N Elementen in jeder Iteration liefert.
Wenn kein Enumerator angegeben wird, wird ein gegebener Block einmal aufgerufen, der eine leere Argumentenliste liefert.
Diese Art von Objekten kann durch Enumerator.product erstellt werden.
Öffentliche Klassenmethoden
Source
static VALUE
enum_product_initialize(int argc, VALUE *argv, VALUE obj)
{
struct enum_product *ptr;
VALUE enums = Qnil, options = Qnil;
rb_scan_args(argc, argv, "*:", &enums, &options);
if (!NIL_P(options) && !RHASH_EMPTY_P(options)) {
rb_exc_raise(rb_keyword_error_new("unknown", rb_hash_keys(options)));
}
rb_check_frozen(obj);
TypedData_Get_Struct(obj, struct enum_product, &enum_product_data_type, ptr);
if (!ptr) rb_raise(rb_eArgError, "unallocated product");
RB_OBJ_WRITE(obj, &ptr->enums, rb_ary_freeze(enums));
return obj;
}
Erzeugt ein neues Enumerator-Objekt, das ein kartesisches Produkt der gegebenen aufzählbaren Objekte erzeugt.
e = Enumerator::Product.new(1..3, [4, 5]) e.to_a #=> [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]] e.size #=> 6
Öffentliche Instanzmethoden
Source
static VALUE
enum_product_each(VALUE obj)
{
RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_product_enum_size);
return enum_product_run(obj, rb_block_proc());
}
Iteriert über die Elemente des ersten aufzählbaren Objekts, indem die Methode „each_entry“ darauf mit den gegebenen Argumenten aufgerufen wird, und geht dann sequenziell zu den folgenden aufzählbaren Objekten über, bis alle aufzählbaren Objekte erschöpft sind.
Wenn kein Block gegeben wird, wird ein Enumerator zurückgegeben. Andernfalls wird self zurückgegeben.
Source
static VALUE
enum_product_inspect(VALUE obj)
{
return rb_exec_recursive(inspect_enum_product, obj, 0);
}
Gibt eine druckbare Version des Produkt-Enumerators zurück.
Source
static VALUE
enum_product_rewind(VALUE obj)
{
struct enum_product *ptr = enum_product_ptr(obj);
VALUE enums = ptr->enums;
long i;
for (i = 0; i < RARRAY_LEN(enums); i++) {
rb_check_funcall(RARRAY_AREF(enums, i), id_rewind, 0, 0);
}
return obj;
}
Setzt den Produkt-Enumerator zurück, indem die Methode „rewind“ für jedes aufzählbare Objekt in umgekehrter Reihenfolge aufgerufen wird. Jeder Aufruf wird nur durchgeführt, wenn das aufzählbare Objekt die Methode unterstützt.
Source
static VALUE
enum_product_size(VALUE obj)
{
return enum_product_total_size(enum_product_ptr(obj)->enums);
}
Gibt die Gesamtgröße des Enumerator-Produkts zurück, die durch Multiplikation der Größen der aufzählbaren Objekte im Produkt berechnet wird. Wenn eines der aufzählbaren Objekte seine Größe als nil oder Float::INFINITY meldet, wird dieser Wert als Größe zurückgegeben.