/* * call-seq: * hsh.shift -> anArray or obj * * Removes a key-value pair from <i>hsh</i> and returns it as the * two-item array <code>[</code> <i>key, value</i> <code>]</code>, or * the hash's default value if the hash is empty. * * h = { 1 => "a", 2 => "b", 3 => "c" } * h.shift #=> [1, "a"] * h #=> {2=>"b", 3=>"c"} */ static VALUE rb_hash_shift(hash) VALUE hash; { struct shift_var var; rb_hash_modify(hash); var.stop = 0; rb_hash_foreach(hash, shift_i, (st_data_t)&var); if (var.stop) { return rb_assoc_new(var.key, var.val); } else if (FL_TEST(hash, HASH_PROC_DEFAULT)) { return rb_funcall(RHASH(hash)->ifnone, id_call, 2, hash, Qnil); } else { return RHASH(hash)->ifnone; } }