Remove some overhead from methods defined in Ruby in Complex.

This commit is contained in:
Yukihiro "Matz" Matsumoto
2019-05-24 13:15:26 +09:00
parent c33ab7c0bb
commit 4261ba9443
2 changed files with 15 additions and 31 deletions
+10 -27
View File
@@ -1,19 +1,8 @@
class Complex < Numeric
def initialize(real, imaginary)
real = real.to_f unless real.is_a? Numeric
imaginary = imaginary.to_f unless imaginary.is_a? Numeric
@real = real
@imaginary = imaginary
end
def self.polar(abs, arg = 0)
Complex(abs * Math.cos(arg), abs * Math.sin(arg))
end
def self.rectangular(real, imaginary = 0)
_new(real, imaginary)
end
def inspect
"(#{to_s})"
end
@@ -23,43 +12,43 @@ class Complex < Numeric
end
def +@
Complex._new(real, imaginary)
Complex(real, imaginary)
end
def -@
Complex._new(-real, -imaginary)
Complex(-real, -imaginary)
end
def +(rhs)
if rhs.is_a? Complex
Complex._new(real + rhs.real, imaginary + rhs.imaginary)
Complex(real + rhs.real, imaginary + rhs.imaginary)
elsif rhs.is_a? Numeric
Complex._new(real + rhs, imaginary)
Complex(real + rhs, imaginary)
end
end
def -(rhs)
if rhs.is_a? Complex
Complex._new(real - rhs.real, imaginary - rhs.imaginary)
Complex(real - rhs.real, imaginary - rhs.imaginary)
elsif rhs.is_a? Numeric
Complex._new(real - rhs, imaginary)
Complex(real - rhs, imaginary)
end
end
def *(rhs)
if rhs.is_a? Complex
Complex._new(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
Complex(real * rhs.real - imaginary * rhs.imaginary, real * rhs.imaginary + rhs.real * imaginary)
elsif rhs.is_a? Numeric
Complex._new(real * rhs, imaginary * rhs)
Complex(real * rhs, imaginary * rhs)
end
end
def /(rhs)
if rhs.is_a? Complex
div = rhs.real * rhs.real + rhs.imaginary * rhs.imaginary
Complex._new((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
Complex((real * rhs.real + imaginary * rhs.imaginary) / div, (rhs.real * imaginary - real * rhs.imaginary) / div)
elsif rhs.is_a? Numeric
Complex._new(real / rhs, imaginary / rhs)
Complex(real / rhs, imaginary / rhs)
end
end
alias_method :quo, :/
@@ -117,12 +106,6 @@ class Complex < Numeric
alias_method :imag, :imaginary
end
module Kernel
def Complex(real, imaginary = 0)
Complex.rectangular(real, imaginary)
end
end
[Fixnum, Float].each do |cls|
[:+, :-, :*, :/, :==].each do |op|
cls.instance_exec do
+5 -4
View File
@@ -76,11 +76,11 @@ complex_imaginary(mrb_state *mrb, mrb_value self)
}
static mrb_value
complex_s_new(mrb_state *mrb, mrb_value self)
complex_s_rect(mrb_state *mrb, mrb_value self)
{
mrb_float real, imaginary;
mrb_float real, imaginary = 0.0;
mrb_get_args(mrb, "ff", &real, &imaginary);
mrb_get_args(mrb, "f|f", &real, &imaginary);
return complex_new(mrb, real, imaginary);
}
@@ -125,7 +125,8 @@ void mrb_mruby_complex_gem_init(mrb_state *mrb)
comp = mrb_define_class(mrb, "Complex", mrb_class_get(mrb, "Numeric"));
//MRB_SET_INSTANCE_TT(comp, MRB_TT_ISTRUCT);
mrb_undef_class_method(mrb, comp, "new");
mrb_define_class_method(mrb, comp, "_new", complex_s_new, MRB_ARGS_REQ(2));
mrb_define_class_method(mrb, comp, "rectangular", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
mrb_define_method(mrb, mrb->kernel_module, "Complex", complex_s_rect, MRB_ARGS_REQ(1)|MRB_ARGS_OPT(1));
mrb_define_method(mrb, comp, "real", complex_real, MRB_ARGS_NONE());
mrb_define_method(mrb, comp, "imaginary", complex_imaginary, MRB_ARGS_NONE());
#ifndef MRB_WITHOUT_FLOAT