APIdock / Ruby
/
method

slice!

v2_5_5 - Show latest stable - Class: Array
slice!(p1, p2 = v2)
public

Deletes the element(s) given by an index (optionally up to length elements) or by a range.

Returns the deleted object (or objects), or nil if the index is out of range.

a = [ "a", "b", "c" ]
a.slice! (1) #=> "b"
a #=> ["a", "c"]
a.slice! (-1) #=> "c"
a #=> ["a"]
a.slice! (100) #=> nil
a #=> ["a"]
static VALUE
rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary)
{
 VALUE arg1, arg2;
 long pos, len, orig_len;
 rb_ary_modify_check(ary);
 if (argc == 2) {
 pos = NUM2LONG(argv[0]);
 len = NUM2LONG(argv[1]);
 delete_pos_len:
 if (len < 0) return Qnil;
 orig_len = RARRAY_LEN(ary);
 if (pos < 0) {
 pos += orig_len;
 if (pos < 0) return Qnil;
 }
 else if (orig_len < pos) return Qnil;
 if (orig_len < pos + len) {
 len = orig_len - pos;
 }
 if (len == 0) return rb_ary_new2(0);
 arg2 = rb_ary_new4(len, RARRAY_CONST_PTR(ary)+pos);
 RBASIC_SET_CLASS(arg2, rb_obj_class(ary));
 rb_ary_splice(ary, pos, len, 0, 0);
 return arg2;
 }
 if (argc != 1) {
 /* error report */
 rb_scan_args(argc, argv, "11", NULL, NULL);
 }
 arg1 = argv[0];
 if (!FIXNUM_P(arg1)) {
 switch (rb_range_beg_len(arg1, &pos, &len, RARRAY_LEN(ary), 0)) {
 case Qtrue:
 /* valid range */
 goto delete_pos_len;
 case Qnil:
 /* invalid range */
 return Qnil;
 default:
 /* not a range */
 break;
 }
 }
 return rb_ary_delete_at(ary, NUM2LONG(arg1));
}

AltStyle によって変換されたページ (->オリジナル) /