diff options
author | Nobuyoshi Nakada <[email protected]> | 2019-12-26 15:50:34 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2019-12-26 15:50:34 +0900 |
commit | b25e27277dc39f25cfca4db8452d254f6cc8046e () | |
tree | e1cbb6fe0b4768c06dc335a1ceb8719138473651 | |
parent | dced0e57453ed4cf8703dee61454334baa5a034e (diff) |
Transform hash keys by a hash [Feature #16274]
-rw-r--r-- | hash.c | 77 | ||||
-rw-r--r-- | test/ruby/test_hash.rb | 10 |
2 files changed, 78 insertions, 9 deletions
@@ -3023,6 +3023,28 @@ rb_hash_each_pair(VALUE hash) return hash; } static int transform_keys_i(VALUE key, VALUE value, VALUE result) { @@ -3049,14 +3071,28 @@ transform_keys_i(VALUE key, VALUE value, VALUE result) * If no block is given, an enumerator is returned instead. */ static VALUE -rb_hash_transform_keys(VALUE hash) { VALUE result; - RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size); result = rb_hash_new(); if (!RHASH_EMPTY_P(hash)) { - rb_hash_foreach(hash, transform_keys_i, result); } return result; @@ -3082,17 +3118,40 @@ static VALUE rb_hash_flatten(int argc, VALUE *argv, VALUE hash); * If no block is given, an enumerator is returned instead. */ static VALUE -rb_hash_transform_keys_bang(VALUE hash) { - RETURN_SIZED_ENUMERATOR(hash, 0, 0, hash_enum_size); rb_hash_modify_check(hash); if (!RHASH_TABLE_EMPTY_P(hash)) { long i; VALUE pairs = rb_hash_flatten(0, NULL, hash); rb_hash_clear(hash); for (i = 0; i < RARRAY_LEN(pairs); i += 2) { - VALUE key = RARRAY_AREF(pairs, i), new_key = rb_yield(key), - val = RARRAY_AREF(pairs, i+1); rb_hash_aset(hash, new_key, val); } } @@ -6285,8 +6344,8 @@ Init_Hash(void) rb_define_method(rb_cHash, "each_pair", rb_hash_each_pair, 0); rb_define_method(rb_cHash, "each", rb_hash_each_pair, 0); - rb_define_method(rb_cHash, "transform_keys", rb_hash_transform_keys, 0); - rb_define_method(rb_cHash, "transform_keys!", rb_hash_transform_keys_bang, 0); rb_define_method(rb_cHash, "transform_values", rb_hash_transform_values, 0); rb_define_method(rb_cHash, "transform_values!", rb_hash_transform_values_bang, 0); @@ -1638,6 +1638,9 @@ class TestHash < Test::Unit::TestCase y = x.transform_keys.with_index {|k, i| "#{k}.#{i}" } assert_equal(%w(a.0 b.1 c.2), y.keys) end def test_transform_keys_bang @@ -1660,6 +1663,13 @@ class TestHash < Test::Unit::TestCase x = @cls[true => :a, false => :b] x.transform_keys! {|k| !k } assert_equal([false, :a, true, :b], x.flatten) end def test_transform_values |