diff options
author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2021-12-03 23:13:27 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2022-06-17 01:22:24 +0900 |
commit | 278fefb96294adf9d27a78f919c714a31b65ef58 (patch) | |
tree | dba5f9b03d85d34209344b3f85203c15868e3bdf /hash.c | |
parent | 51835135a0586f439f581beece13df20100123f0 (diff) | |
download | ruby-278fefb96294adf9d27a78f919c714a31b65ef58.tar.gz |
ENV.merge! support multile arguments [Feature #18279]
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 25 |
1 files changed, 15 insertions, 10 deletions
@@ -6589,10 +6589,12 @@ env_update_block_i(VALUE key, VALUE val, VALUE _) /* * call-seq: - * ENV.update(hash) -> ENV - * ENV.update(hash) { |name, env_val, hash_val| block } -> ENV - * ENV.merge!(hash) -> ENV - * ENV.merge!(hash) { |name, env_val, hash_val| block } -> ENV + * ENV.update -> ENV + * ENV.update(*hashes) -> ENV + * ENV.update(*hashes) { |name, env_val, hash_val| block } -> ENV + * ENV.merge! -> ENV + * ENV.merge!(*hashes) -> ENV + * ENV.merge!(*hashes) { |name, env_val, hash_val| block } -> ENV * * ENV.update is an alias for ENV.merge!. * @@ -6624,13 +6626,16 @@ env_update_block_i(VALUE key, VALUE val, VALUE _) * those following are ignored. */ static VALUE -env_update(VALUE env, VALUE hash) +env_update(int argc, VALUE *argv, VALUE env) { - if (env == hash) return env; - hash = to_hash(hash); rb_foreach_func *func = rb_block_given_p() ? env_update_block_i : env_update_i; - rb_hash_foreach(hash, func, 0); + for (int i = 0; i < argc; ++i) { + VALUE hash = argv[i]; + if (env == hash) continue; + hash = to_hash(hash); + rb_hash_foreach(hash, func, 0); + } return env; } @@ -7458,8 +7463,8 @@ Init_Hash(void) rb_define_singleton_method(envtbl, "freeze", env_freeze, 0); rb_define_singleton_method(envtbl, "invert", env_invert, 0); rb_define_singleton_method(envtbl, "replace", env_replace, 1); - rb_define_singleton_method(envtbl, "update", env_update, 1); - rb_define_singleton_method(envtbl, "merge!", env_update, 1); + rb_define_singleton_method(envtbl, "update", env_update, -1); + rb_define_singleton_method(envtbl, "merge!", env_update, -1); rb_define_singleton_method(envtbl, "inspect", env_inspect, 0); rb_define_singleton_method(envtbl, "rehash", env_none, 0); rb_define_singleton_method(envtbl, "to_a", env_to_a, 0); |