Revision: 5259 http://trac.macosforge.org/projects/ruby/changeset/5259 Author: watson1978@gmail.com Date: 2011-03-06 23:30:41 -0800 (Sun, 06 Mar 2011) Log Message: ----------- Implements the Hash#select!. Test Script: {{{ require 'test/unit/assertions.rb' include Test::Unit::Assertions hash = { "Alice" => 50, "Bob" => 60, "Carol" => 90, "David" => 40 } hash.select! {|k, v| v >= 60 } assert_equal({"Bob"=>60, "Carol"=>90}, hash) puts :ok }}} Modified Paths: -------------- MacRuby/trunk/hash.c MacRuby/trunk/spec/frozen/tags/macruby/core/hash/select_tags.txt Modified: MacRuby/trunk/hash.c =================================================================== --- MacRuby/trunk/hash.c 2011-03-07 06:11:34 UTC (rev 5258) +++ MacRuby/trunk/hash.c 2011-03-07 07:30:41 UTC (rev 5259) @@ -870,18 +870,6 @@ return result; } -/* - * call-seq: - * hsh.keep_if {| key, value | block } -> hsh - * hsh.keep_if -> an_enumerator - * - * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> - * evaluates to false. - * - * If no block is given, an enumerator is returned instead. - * - */ - static int keep_if_i(VALUE key, VALUE value, VALUE hash) { @@ -895,6 +883,43 @@ return ST_CONTINUE; } +/* + * call-seq: + * hsh.select! {| key, value | block } -> hsh or nil + * hsh.select! -> an_enumerator + * + * Equivalent to <code>Hash#keep_if</code>, but returns + * <code>nil</code> if no changes were made. + */ + +static VALUE +rhash_select_bang(VALUE hash, SEL sel) +{ + RETURN_ENUMERATOR(hash, 0, 0); + rhash_modify(hash); + if (!RHASH(hash)->tbl) { + return Qnil; + } + const long n = rhash_len(hash); + rb_hash_foreach(hash, keep_if_i, hash); + if (n == rhash_len(hash)) { + return Qnil; + } + return hash; +} + +/* + * call-seq: + * hsh.keep_if {| key, value | block } -> hsh + * hsh.keep_if -> an_enumerator + * + * Deletes every key-value pair from <i>hsh</i> for which <i>block</i> + * evaluates to false. + * + * If no block is given, an enumerator is returned instead. + * + */ + VALUE rhash_keep_if(VALUE hash, SEL sel) { @@ -1866,6 +1891,7 @@ rb_objc_define_method(rb_cRubyHash, "delete_if", rhash_delete_if, 0); rb_objc_define_method(rb_cRubyHash, "keep_if", rhash_keep_if, 0); rb_objc_define_method(rb_cRubyHash, "select", rhash_select, 0); + rb_objc_define_method(rb_cRubyHash, "select!", rhash_select_bang, 0); rb_objc_define_method(rb_cRubyHash, "reject", rhash_reject, 0); rb_objc_define_method(rb_cRubyHash, "reject!", rhash_reject_bang, 0); rb_objc_define_method(rb_cRubyHash, "clear", rhash_clear, 0); Modified: MacRuby/trunk/spec/frozen/tags/macruby/core/hash/select_tags.txt =================================================================== --- MacRuby/trunk/spec/frozen/tags/macruby/core/hash/select_tags.txt 2011-03-07 06:11:34 UTC (rev 5258) +++ MacRuby/trunk/spec/frozen/tags/macruby/core/hash/select_tags.txt 2011-03-07 07:30:41 UTC (rev 5259) @@ -1,4 +0,0 @@ -fails:Hash#select! is equivalent to keep_if if changes are made -fails:Hash#select! returns nil if no changes were made -fails:Hash#select! raises a RuntimeError if called on a frozen instance that is modified -fails:Hash#select! raises a RuntimeError if called on a frozen instance that would not be modified
participants (1)
-
source_changes@macosforge.org