diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-27 03:03:27 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-27 03:03:27 +0900 |
| commit | 7e175d8130bf329d44368a057587a9e4b3133589 (patch) | |
| tree | 05bcc28852e18a4369b8fdaa45368bcad7227a29 /mrbgems/mruby-hash-ext | |
| parent | 855a3f599188ef0e3c86f95410317d7f212e6ceb (diff) | |
| download | mruby-7e175d8130bf329d44368a057587a9e4b3133589.tar.gz mruby-7e175d8130bf329d44368a057587a9e4b3133589.zip | |
add Hash#fetch; close #2134
Diffstat (limited to 'mrbgems/mruby-hash-ext')
| -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 |
