Создает ли Ruby Enumerable # zip массивы внутри?

В Ruby - элегантно сравните два перечислителя , было сказано

Проблема с zip в том, что он создает массивы внутри, независимо от того какой Enumerable вы проходите. Есть еще одна проблема с длиной ввода params

Я посмотрел на реализацию Enumerable # zip в YARV и увидел

static VALUE
enum_zip(int argc, VALUE *argv, VALUE obj)
{
    int i;
    ID conv;
    NODE *memo;
    VALUE result = Qnil;
    VALUE args = rb_ary_new4(argc, argv);
    int allary = TRUE;

    argv = RARRAY_PTR(args);
    for (i=0; i

Правильно ли я понимаю следующие биты?

Проверьте, все ли аргументы являются массивами, и если да, замените некоторые косвенные ссылка на массив с прямой ссылкой

    for (i=0; i

Если это не все массивы, вместо этого создайте перечислитель

    if (!allary) {
        CONST_ID(conv, "to_enum");
        for (i=0; i

Создайте массив массивов, только если блок не указан

    if (!rb_block_given_p()) {
        result = rb_ary_new();
    }

Если все является массивом, используйте zip_ary , в противном случае используйте zip_i и вызовите блок для каждого набора значений

    /* use NODE_DOT2 as memo(v, v, -) */
    memo = rb_node_newnode(NODE_DOT2, result, args, 0);
    rb_block_call(obj, id_each, 0, 0, allary ? zip_ary : zip_i, (VALUE)memo);

Верните массив массивов, если блок не задан, иначе верните nil ( Qnil )?

    return result;
}

8
задан dreftymac 1 December 2017 в 08:49
поделиться