diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2018-12-04 08:09:18 +0900 |
|---|---|---|
| committer | GitHub <[email protected]> | 2018-12-04 08:09:18 +0900 |
| commit | 20c655dc45a024e87a646852736c49ec61910e45 (patch) | |
| tree | d9074654c2f4e065932590798c31c71ae683d462 /mrbgems/mruby-class-ext | |
| parent | 26475d0a7897c25f8632b776014a19c3a6f6ecc2 (diff) | |
| parent | e300ac8e3a100aa9538560700050dc3df6cdb09d (diff) | |
| download | mruby-20c655dc45a024e87a646852736c49ec61910e45.tar.gz mruby-20c655dc45a024e87a646852736c49ec61910e45.zip | |
Merge pull request #4174 from robfors/module_operators
Adds Module#< and Module#<=
Diffstat (limited to 'mrbgems/mruby-class-ext')
| -rw-r--r-- | mrbgems/mruby-class-ext/mrblib/module.rb | 39 | ||||
| -rw-r--r-- | mrbgems/mruby-class-ext/test/module.rb | 54 |
2 files changed, 93 insertions, 0 deletions
diff --git a/mrbgems/mruby-class-ext/mrblib/module.rb b/mrbgems/mruby-class-ext/mrblib/module.rb new file mode 100644 index 000000000..d35b4cbae --- /dev/null +++ b/mrbgems/mruby-class-ext/mrblib/module.rb @@ -0,0 +1,39 @@ +class Module + + ## + # call-seq: + # mod < other -> true, false, or nil + # + # Returns true if <i>mod</i> is a subclass of <i>other</i>. 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 "A < B".) + # + def <(other) + raise TypeError, 'compared with non class/module' unless other.is_a?(Module) + if self.equal?(other) + false + else + self <= other + end + end + + ## + # call-seq: + # mod <= other -> true, false, or nil + # + # Returns true if <i>mod</i> is a subclass of <i>other</i> or + # is the same as <i>other</i>. 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 "A < B".) + def <=(other) + raise TypeError, 'compared with non class/module' unless other.is_a?(Module) + if self.ancestors.include?(other) + return true + elsif other.ancestors.include?(self) + return false + end + end + +end diff --git a/mrbgems/mruby-class-ext/test/module.rb b/mrbgems/mruby-class-ext/test/module.rb index 71a8da451..52e04ab37 100644 --- a/mrbgems/mruby-class-ext/test/module.rb +++ b/mrbgems/mruby-class-ext/test/module.rb @@ -1,3 +1,57 @@ +assert 'Module#<' do + a = Class.new + b = Class.new(a) + c = Class.new(a) + d = Module.new + e = Class.new { include d } + f = Module.new { include d } + + # compare class to class + assert_true b < a + assert_false b < b + assert_false a < b + assert_nil c < b + + # compare class to module + assert_true e < d + assert_false d < e + assert_nil a < d + + # compare module to module + assert_true f < d + assert_false f < f + assert_false d < f + + assert_raise(TypeError) { a < Object.new } +end + +assert 'Module#<=' do + a = Class.new + b = Class.new(a) + c = Class.new(a) + d = Module.new + e = Class.new { include d } + f = Module.new { include d } + + # compare class to class + assert_true b <= a + assert_true b <= b + assert_false a <= b + assert_nil c <= b + + # compare class to module + assert_true e <= d + assert_false d <= e + assert_nil a <= d + + # compare module to module + assert_true f <= d + assert_true f <= f + assert_false d <= f + + assert_raise(TypeError) { a <= Object.new } +end + assert 'Module#name' do module Outer class Inner; end |
