summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2018-12-04 08:41:09 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2018-12-04 08:41:09 +0900
commite6bad6766a8ddc00c23b1c0204b047dfbf8e3041 (patch)
tree86603a0905f687f04442aaa6273409af93b0f9d4
parentd5d9cc8b62bd173375046d07fc62b75c3e2d807e (diff)
downloadmruby-e6bad6766a8ddc00c23b1c0204b047dfbf8e3041.tar.gz
mruby-e6bad6766a8ddc00c23b1c0204b047dfbf8e3041.zip
Add new methods `Module#{>,>=,<=>}`; ref #4174
-rw-r--r--mrbgems/mruby-class-ext/mrblib/module.rb51
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