mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #5832 from FnControlRuby/comparable
Fix `Comparable#clamp` with range
This commit is contained in:
@@ -43,13 +43,13 @@ module Comparable
|
||||
def clamp(min, max=nil)
|
||||
if max.nil?
|
||||
if min.kind_of?(Range)
|
||||
max = min.begin
|
||||
max = min.end
|
||||
if max.nil?
|
||||
max = self
|
||||
elsif min.exclude_end?
|
||||
raise ArgumentError, "cannot clamp with an exclusive range"
|
||||
end
|
||||
min = min.end
|
||||
min = min.begin
|
||||
if min.nil?
|
||||
min = self
|
||||
end
|
||||
@@ -57,17 +57,24 @@ module Comparable
|
||||
raise TypeError, "wrong argument type #{min.class}"
|
||||
end
|
||||
end
|
||||
if (min <=> max) > 0
|
||||
c = min <=> max
|
||||
if c.nil?
|
||||
raise ArgumentError, "comparison of #{min.class} with #{max.class} failed"
|
||||
elsif c > 0
|
||||
raise ArgumentError, "min argument must be smaller than max argument"
|
||||
end
|
||||
c = self <=> min
|
||||
if c == 0
|
||||
if c.nil?
|
||||
raise ArgumentError, "comparison of #{self.class} with #{min.class} failed"
|
||||
elsif c == 0
|
||||
return self
|
||||
elsif c < 0
|
||||
return min
|
||||
end
|
||||
c = self <=> max
|
||||
if c > 0
|
||||
if c.nil?
|
||||
raise ArgumentError, "comparison of #{self.class} with #{max.class} failed"
|
||||
elsif c > 0
|
||||
return max
|
||||
else
|
||||
return self
|
||||
|
||||
@@ -78,6 +78,16 @@ mrb_equal_m(mrb_state *mrb, mrb_value self)
|
||||
return mrb_bool_value(mrb_equal(mrb, self, arg));
|
||||
}
|
||||
|
||||
static mrb_value
|
||||
mrb_cmp_m(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
mrb_value arg = mrb_get_arg1(mrb);
|
||||
|
||||
if (mrb_obj_equal(mrb, self, arg))
|
||||
return mrb_fixnum_value(0);
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
/* 15.3.1.3.3 */
|
||||
/* 15.3.1.3.33 */
|
||||
/*
|
||||
@@ -534,6 +544,7 @@ mrb_init_kernel(mrb_state *mrb)
|
||||
|
||||
|
||||
mrb_define_method(mrb, krn, "===", mrb_equal_m, MRB_ARGS_REQ(1)); /* 15.3.1.3.2 */
|
||||
mrb_define_method(mrb, krn, "<=>", mrb_cmp_m, MRB_ARGS_REQ(1));
|
||||
mrb_define_method(mrb, krn, "block_given?", mrb_f_block_given_p_m, MRB_ARGS_NONE()); /* 15.3.1.3.6 */
|
||||
mrb_define_method(mrb, krn, "class", mrb_obj_class_m, MRB_ARGS_NONE()); /* 15.3.1.3.7 */
|
||||
mrb_define_method(mrb, krn, "clone", mrb_obj_clone, MRB_ARGS_NONE()); /* 15.3.1.3.8 */
|
||||
|
||||
Reference in New Issue
Block a user