Add `Hash#transform_keys!` and `Hash#transform_values`.

parent d7fef24a
......@@ -404,6 +404,26 @@ class Hash
end
##
# call-seq:
# hsh.transform_keys! {|key| block } -> hsh
# hsh.transform_keys! -> an_enumerator
#
# Invokes the given block once for each key in <i>hsh</i>, replacing it
# with the new key returned by the block, and then returns <i>hsh</i>.
#
# If no block is given, an enumerator is returned instead.
#
def transform_keys!(&b)
return to_enum :transform_keys! unless block_given?
self.keys.each do |k|
value = self[k]
new_key = yield(k)
self.__delete(k)
self[new_key] = value
end
self
end
##
# call-seq:
# hsh.transform_values {|value| block } -> new_hash
# hsh.transform_values -> an_enumerator
#
......@@ -421,4 +441,21 @@ class Hash
end
hash
end
##
# call-seq:
# hsh.transform_values! {|key| block } -> hsh
# hsh.transform_values! -> an_enumerator
#
# Invokes the given block once for each value in the hash, replacing
# with the new value returned by the block, and then returns <i>hsh</i>.
#
# If no block is given, an enumerator is returned instead.
#
def transform_values!(&b)
return to_enum :transform_values! unless block_given?
self.keys.each do |k|
self[k] = yield(self[k])
end
self
end
end
......@@ -263,6 +263,8 @@ assert("Hash#transform_keys") do
{1 => 100, 2 => 200})
assert_equal(h.transform_keys.with_index{|k, i| "#{k}.#{i}"},
{"1.0" => 100, "2.1" => 200})
assert_equal(h.transform_keys!{|k|k.to_i}, h)
assert_equal(h, {1 => 100, 2 => 200})
end
assert("Hash#transform_values") do
......@@ -273,4 +275,6 @@ assert("Hash#transform_values") do
{a: "1", b: "2", c: "3"})
assert_equal(h.transform_values.with_index{|v, i| "#{v}.#{i}"},
{a: "1.0", b: "2.1", c: "3.2"})
assert_equal(h.transform_values!{|v|v.to_s}, h)
assert_equal(h, {a: "1", b: "2", c: "3"})
end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment