diff options
| -rw-r--r-- | mrblib/hash.rb | 5 | ||||
| -rw-r--r-- | src/hash.c | 8 | ||||
| -rw-r--r-- | test/t/hash.rb | 9 |
3 files changed, 17 insertions, 5 deletions
diff --git a/mrblib/hash.rb b/mrblib/hash.rb index 6fae521a8..e608d2971 100644 --- a/mrblib/hash.rb +++ b/mrblib/hash.rb @@ -152,6 +152,11 @@ class Hash hash.each_key{|k| self[k] = hash[k] } + if hash.default_proc + self.default_proc = hash.default_proc + elsif hash.default + self.default = hash.default + end self end # ISO 15.2.13.4.17 diff --git a/src/hash.c b/src/hash.c index a09d509d0..93f0650dd 100644 --- a/src/hash.c +++ b/src/hash.c @@ -376,14 +376,12 @@ mrb_hash_aget(mrb_state *mrb, mrb_value self) static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash) { - mrb_value *argv; - int argc; mrb_value key; + mrb_bool given; - mrb_get_args(mrb, "*", &argv, &argc); + mrb_get_args(mrb, "|o?", &key, &given); if (MRB_RHASH_PROCDEFAULT_P(hash)) { - if (argc == 0) return mrb_nil_value(); - key = argv[0]; + if (!given) return mrb_nil_value(); return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key); } else { diff --git a/test/t/hash.rb b/test/t/hash.rb index ec9da8ca7..8a10f4026 100644 --- a/test/t/hash.rb +++ b/test/t/hash.rb @@ -230,6 +230,15 @@ assert('Hash#replace', '15.2.13.4.23') do b = Hash.new.replace(a) assert_equal({ 'abc_key' => 'abc_value' }, b) + + a = Hash.new(42) + b = {} + b.replace(a) + assert_equal(42, b[1]) + + a = Hash.new{|h,x| x} + b.replace(a) + assert_equal(127, b[127]) end assert('Hash#shift', '15.2.13.4.24') do |
