В 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;
}