diff options
| -rw-r--r-- | mrbgems/mruby-hash-ext/mrblib/hash.rb | 14 | ||||
| -rw-r--r-- | mrbgems/mruby-hash-ext/test/hash.rb | 12 |
2 files changed, 26 insertions, 0 deletions
diff --git a/mrbgems/mruby-hash-ext/mrblib/hash.rb b/mrbgems/mruby-hash-ext/mrblib/hash.rb index 723a0b907..bf3836514 100644 --- a/mrbgems/mruby-hash-ext/mrblib/hash.rb +++ b/mrbgems/mruby-hash-ext/mrblib/hash.rb @@ -13,4 +13,18 @@ class Hash alias each_pair each alias update merge! + + def fetch(key, none=NONE, &block) + unless self.key?(key) + if block + block.call + elsif none != NONE + none + else + raise RuntimeError, "Key not found: #{key}" + end + else + self[key] + end + end end diff --git a/mrbgems/mruby-hash-ext/test/hash.rb b/mrbgems/mruby-hash-ext/test/hash.rb index cdf00173a..661da3af3 100644 --- a/mrbgems/mruby-hash-ext/test/hash.rb +++ b/mrbgems/mruby-hash-ext/test/hash.rb @@ -27,3 +27,15 @@ assert('Hash#values_at') do h = Hash.new { |hash,k| hash[k] = k } assert_equal keys, h.values_at(*keys) end + +assert('Hash#fetch') do + h = { "cat" => "feline", "dog" => "canine", "cow" => "bovine" } + assert_equal "feline", h.fetch("cat") + assert_equal "mickey", h.fetch("mouse", "mickey") + assert_equal "minny", h.fetch("mouse"){"minny"} + begin + h.fetch("gnu") + rescue => e + assert_kind_of(StandardError, e); + end +end |
