ary_reject_bang, C reject!.
static VALUE
ary_reject_bang(VALUE ary)
{
long i;
VALUE result = Qnil;
rb_ary_modify_check(ary);
for (i = 0; i < RARRAY_LEN(ary); ) {
VALUE v = RARRAY_PTR(ary)[i];
if (RTEST(rb_yield(v))) {
rb_ary_delete_at(ary, i);
result = ary;
}
else {
i++;
}
}
return result;
}
RARRAY_PTR - , ruby.h, C Ruby. rb_ary_delete_at, :
VALUE
rb_ary_delete_at(VALUE ary, long pos)
{
long len = RARRAY_LEN(ary);
VALUE del;
if (pos >= len) return Qnil;
if (pos < 0) {
pos += len;
if (pos < 0) return Qnil;
}
rb_ary_modify(ary);
del = RARRAY_PTR(ary)[pos];
MEMMOVE(RARRAY_PTR(ary)+pos, RARRAY_PTR(ary)+pos+1, VALUE,
RARRAY_LEN(ary)-pos-1);
ARY_INCREASE_LEN(ary, -1);
return del;
}
source
share