diff options
| author | Nobuyoshi Nakada <[email protected]> | 2015-11-14 17:05:57 +0900 |
|---|---|---|
| committer | Nobuyoshi Nakada <[email protected]> | 2015-11-14 17:05:57 +0900 |
| commit | bf5f83ffdafc1aa23c49f8bc28db18923df7c784 (patch) | |
| tree | 6ed7244aa4f28698bed2b0aa4e8d1be049908459 /mrblib | |
| parent | 9c108002bfa85e6f554da4bc302cd1cf3b602294 (diff) | |
| download | mruby-bf5f83ffdafc1aa23c49f8bc28db18923df7c784.tar.gz mruby-bf5f83ffdafc1aa23c49f8bc28db18923df7c784.zip | |
Add comparison methods to Hash
Diffstat (limited to 'mrblib')
| -rw-r--r-- | mrblib/hash.rb | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/mrblib/hash.rb b/mrblib/hash.rb index e3e709070..8e56fca81 100644 --- a/mrblib/hash.rb +++ b/mrblib/hash.rb @@ -346,6 +346,102 @@ class Hash h.each_key{|k| self[k] = h[k]} self end + + ## + # call-seq: + # hash < other -> true or false + # + # Returns <code>true</code> if <i>hash</i> is subset of + # <i>other</i>. + # + # h1 = {a:1, b:2} + # h2 = {a:1, b:2, c:3} + # h1 < h2 #=> true + # h2 < h1 #=> false + # h1 < h1 #=> false + # + def <(hash) + begin + hash = hash.to_hash + rescue NoMethodError + raise TypeError, "can't convert #{hash.class} to Hash" + end + size < hash.size and all? {|key, val| + hash.key?(key) and hash[key] == val + } + end + + ## + # call-seq: + # hash <= other -> true or false + # + # Returns <code>true</code> if <i>hash</i> is subset of + # <i>other</i> or equals to <i>other</i>. + # + # h1 = {a:1, b:2} + # h2 = {a:1, b:2, c:3} + # h1 <= h2 #=> true + # h2 <= h1 #=> false + # h1 <= h1 #=> true + # + def <=(hash) + begin + hash = hash.to_hash + rescue NoMethodError + raise TypeError, "can't convert #{hash.class} to Hash" + end + size <= hash.size and all? {|key, val| + hash.key?(key) and hash[key] == val + } + end + + ## + # call-seq: + # hash > other -> true or false + # + # Returns <code>true</code> if <i>other</i> is subset of + # <i>hash</i>. + # + # h1 = {a:1, b:2} + # h2 = {a:1, b:2, c:3} + # h1 > h2 #=> false + # h2 > h1 #=> true + # h1 > h1 #=> false + # + def >(hash) + begin + hash = hash.to_hash + rescue NoMethodError + raise TypeError, "can't convert #{hash.class} to Hash" + end + size > hash.size and hash.all? {|key, val| + key?(key) and self[key] == val + } + end + + ## + # call-seq: + # hash >= other -> true or false + # + # Returns <code>true</code> if <i>other</i> is subset of + # <i>hash</i> or equals to <i>hash</i>. + # + # h1 = {a:1, b:2} + # h2 = {a:1, b:2, c:3} + # h1 >= h2 #=> false + # h2 >= h1 #=> true + # h1 >= h1 #=> true + # + def >=(hash) + begin + hash = hash.to_hash + rescue NoMethodError + raise TypeError, "can't convert #{hash.class} to Hash" + end + size >= hash.size and hash.all? {|key, val| + key?(key) and self[key] == val + } + end end ## |
