diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-12-04 08:41:09 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-12-04 08:41:09 +0900 |
| commit | e6bad6766a8ddc00c23b1c0204b047dfbf8e3041 (patch) | |
| tree | 86603a0905f687f04442aaa6273409af93b0f9d4 | |
| parent | d5d9cc8b62bd173375046d07fc62b75c3e2d807e (diff) | |
| download | mruby-e6bad6766a8ddc00c23b1c0204b047dfbf8e3041.tar.gz mruby-e6bad6766a8ddc00c23b1c0204b047dfbf8e3041.zip | |
Add new methods `Module#{>,>=,<=>}`; ref #4174
| -rw-r--r-- | mrbgems/mruby-class-ext/mrblib/module.rb | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/mrbgems/mruby-class-ext/mrblib/module.rb b/mrbgems/mruby-class-ext/mrblib/module.rb index 8102b5417..301585187 100644 --- a/mrbgems/mruby-class-ext/mrblib/module.rb +++ b/mrbgems/mruby-class-ext/mrblib/module.rb @@ -35,4 +35,55 @@ class Module end end + ## + # call-seq: + # mod > other -> true, false, or nil + # + # Returns true if `mod` is an ancestor of `other`. Returns + # <code>nil</code> if there's no relationship between the two. + # (Think of the relationship in terms of the class definition: + # "class A < B" implies "B > A".) + # + def >(other) + if self.equal?(other) + false + else + self >= other + end + end + + ## + # call-seq: + # mod >= other -> true, false, or nil + # + # Returns true if `mod` is an ancestor of `other`, or the + # two modules are the same. Returns + # <code>nil</code> if there's no relationship between the two. + # (Think of the relationship in terms of the class definition: + # "class A < B" implies "B > A".) + # + def >=(other) + raise TypeError, 'compared with non class/module' unless other.is_a?(Module) + return other < self + end + + ## + # call-seq: + # module <=> other_module -> -1, 0, +1, or nil + # + # Comparison---Returns -1, 0, +1 or nil depending on whether `module` + # includes `other_module`, they are the same, or if `module` is included by + # `other_module`. + # + # Returns `nil` if `module` has no relationship with `other_module`, if + # `other_module` is not a module, or if the two values are incomparable. + # + def <=>(other) + return 0 if self.equal?(other) + return nil unless other.is_a?(Module) + cmp = self < other + return -1 if cmp + return 1 unless cmp.nil? + return nil + end end |
