類別 Enumerator::Product

Enumerator::Product 會產生任意數量的可列舉物件的笛卡兒積。迭代可列舉物件的積大致等於巢狀 each_entry 迴圈,其中最右邊物件的迴圈會放在最內層。

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"]

針對每個可列舉物件使用的函式是 `each_entry`,而非 `each`,因此 N 個可列舉物件的積會在每次迭代中產生一個恰好有 N 個元素的陣列。

如果未提供列舉器,它會呼叫給定的區塊一次,並產生一個空的引數清單。

此類型的物件可以透過 Enumerator.product 建立。

公開類別方法

Enumerator::Product.new(*enums) → enum 按一下以切換來源

產生一個新的列舉器物件,用以產生給定可列舉物件的笛卡兒積。

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
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");

    ptr->enums = rb_obj_freeze(enums);

    return obj;
}

公開實例方法

each { |...| ... } → obj 按一下以切換來源
each → 列舉器

透過呼叫其 “each_entry” 函式並提供給定的引數,迭代第一個可列舉物件的元素,然後依序繼續執行後續的可列舉物件,直到所有可列舉物件都已耗盡。

如果未提供區塊,則傳回列舉器。否則,傳回 self。

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());
}
inspect → 字串 按一下以切換來源

傳回積列舉器的可列印版本。

static VALUE
enum_product_inspect(VALUE obj)
{
    return rb_exec_recursive(inspect_enum_product, obj, 0);
}
rewind → obj 按一下以切換來源

透過以反向順序呼叫每個可列舉物件的 “rewind” 函式,倒轉積列舉器。只有當可列舉物件回應函式時,才會執行每個呼叫。

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;
}
size → int、Float::INFINITY 或 nil 按一下以切換來源

傳回列舉器積的總大小,計算方式為將積中可列舉物件的大小相乘。如果任何可列舉物件報告其大小為 nil 或 Float::INFINITY,則傳回該值作為大小。

static VALUE
enum_product_size(VALUE obj)
{
    return enum_product_total_size(enum_product_ptr(obj)->enums);
}