summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-rational
diff options
context:
space:
mode:
authorUkrainskiy Sergey <[email protected]>2018-08-09 17:09:02 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2019-05-15 16:57:21 +0900
commit8808219e6d51673e6fa582819703e6e5912439b0 (patch)
tree7ad830fc1ea3da35d81fe853cd44023790131895 /mrbgems/mruby-rational
parent7f1f499b2277c4636824b7f3e9b301576aaddba5 (diff)
downloadmruby-8808219e6d51673e6fa582819703e6e5912439b0.tar.gz
mruby-8808219e6d51673e6fa582819703e6e5912439b0.zip
Initial suffix support
Diffstat (limited to 'mrbgems/mruby-rational')
-rw-r--r--mrbgems/mruby-rational/mrbgem.rake5
-rw-r--r--mrbgems/mruby-rational/mrblib/rational.rb46
-rw-r--r--mrbgems/mruby-rational/test/rational.rb3
3 files changed, 54 insertions, 0 deletions
diff --git a/mrbgems/mruby-rational/mrbgem.rake b/mrbgems/mruby-rational/mrbgem.rake
new file mode 100644
index 000000000..4b540dec4
--- /dev/null
+++ b/mrbgems/mruby-rational/mrbgem.rake
@@ -0,0 +1,5 @@
+MRuby::Gem::Specification.new('mruby-rational') do |spec|
+ spec.license = 'MIT'
+ spec.author = 'mruby developers'
+ spec.summary = 'Rational class'
+end
diff --git a/mrbgems/mruby-rational/mrblib/rational.rb b/mrbgems/mruby-rational/mrblib/rational.rb
new file mode 100644
index 000000000..457c0488a
--- /dev/null
+++ b/mrbgems/mruby-rational/mrblib/rational.rb
@@ -0,0 +1,46 @@
+class Rational < Numeric
+ def initialize(numerator = 0, denominator = 1)
+ @numerator = numerator
+ @denominator = denominator
+ end
+
+ attr_reader :numerator, :denominator
+end
+
+def Rational(numerator = 0, denominator = 1)
+ Rational.new(numerator, denominator)
+end
+
+module ForwardOperatorToRational
+ def __forward_operator_to_rational(op, &b)
+ original_operator_name = "__original_operator_#{op}_rational"
+ alias_method original_operator_name, op
+ define_method op do |rhs|
+ if rhs.is_a? Rational
+ Rational.new(self).send(op, rhs)
+ else
+ send(original_operator_name, rhs)
+ end
+ end
+ end
+
+ def __forward_operators_to_rational
+ __forward_operator_to_rational :+
+ __forward_operator_to_rational :-
+ __forward_operator_to_rational :*
+ __forward_operator_to_rational :/
+
+ singleton_class.undef_method :__forward_operator_to_rational
+ singleton_class.undef_method :__forward_operators_to_rational
+ end
+end
+
+class Fixnum
+ extend ForwardOperatorToRational
+ __forward_operators_to_rational
+end
+
+class Float
+ extend ForwardOperatorToRational
+ __forward_operators_to_rational
+end \ No newline at end of file
diff --git a/mrbgems/mruby-rational/test/rational.rb b/mrbgems/mruby-rational/test/rational.rb
new file mode 100644
index 000000000..6f20a6cd4
--- /dev/null
+++ b/mrbgems/mruby-rational/test/rational.rb
@@ -0,0 +1,3 @@
+assert 'Rational' do
+ assert_equal Rational, 0r.class
+end \ No newline at end of file