From aca49d6d59bff4716171ecb949b20785a3c6dee8 Mon Sep 17 00:00:00 2001 From: Erik Michaels-Ober Date: Mon, 18 Nov 2013 18:52:45 +0100 Subject: [PATCH 1/3] Modify Numeric#nonzero? to return true or false --- numeric.c | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/numeric.c b/numeric.c index 734ab3455ba546..26055e9c58f3fb 100644 --- a/numeric.c +++ b/numeric.c @@ -574,24 +574,18 @@ num_zero_p(VALUE num) /* * call-seq: - * num.nonzero? -> self or nil + * num.nonzero? -> true or false * - * Returns +self+ if +num+ is not zero, +nil+ otherwise. - * - * This behavior is useful when chaining comparisons: - * - * a = %w( z Bb bB bb BB a aA Aa AA A ) - * b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero? || a <=> b } - * b #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"] + * Returns +true+ if +num+ is not zero, +false+ otherwise. */ static VALUE num_nonzero_p(VALUE num) { - if (RTEST(rb_funcall(num, rb_intern("zero?"), 0, 0))) { - return Qnil; + if (rb_equal(num, INT2FIX(0))) { + return Qfalse; } - return num; + return Qtrue; } /* From 09fff2872848479d61425d2e428067cdf04ab2c2 Mon Sep 17 00:00:00 2001 From: Erik Michaels-Ober Date: Mon, 18 Nov 2013 18:54:29 +0100 Subject: [PATCH 2/3] Add Number#nonzero, which returns self or nil --- numeric.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/numeric.c b/numeric.c index 26055e9c58f3fb..afcd52096004fb 100644 --- a/numeric.c +++ b/numeric.c @@ -572,6 +572,29 @@ num_zero_p(VALUE num) } +/* + * call-seq: + * num.nonzero -> self or nil + * + * Returns +self+ if +num+ is not zero, +nil+ otherwise. + * + * This behavior is useful when chaining comparisons: + * + * a = %w( z Bb bB bb BB a aA Aa AA A ) + * b = a.sort {|a,b| (a.downcase <=> b.downcase).nonzero || a <=> b } + * b #=> ["A", "a", "AA", "Aa", "aA", "BB", "Bb", "bB", "bb", "z"] + */ + +static VALUE +num_nonzero(VALUE num) +{ + if (RTEST(rb_funcall(num, rb_intern("zero?"), 0, 0))) { + return Qnil; + } + return num; +} + + /* * call-seq: * num.nonzero? -> true or false @@ -3846,6 +3869,7 @@ Init_Numeric(void) rb_define_method(rb_cNumeric, "real?", num_real_p, 0); rb_define_method(rb_cNumeric, "integer?", num_int_p, 0); rb_define_method(rb_cNumeric, "zero?", num_zero_p, 0); + rb_define_method(rb_cNumeric, "nonzero", num_nonzero, 0); rb_define_method(rb_cNumeric, "nonzero?", num_nonzero_p, 0); rb_define_method(rb_cNumeric, "floor", num_floor, 0); From 717a6c923b2ab5c4e72d967808d9fe9d6d12af51 Mon Sep 17 00:00:00 2001 From: Erik Michaels-Ober Date: Mon, 18 Nov 2013 19:06:01 +0100 Subject: [PATCH 3/3] Add tests for Numeric#nonzero --- test/ruby/test_integer_comb.rb | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/test/ruby/test_integer_comb.rb b/test/ruby/test_integer_comb.rb index 548102d0349d66..65952390fe5da8 100644 --- a/test/ruby/test_integer_comb.rb +++ b/test/ruby/test_integer_comb.rb @@ -447,16 +447,19 @@ def test_remainder def test_zero_nonzero VS.each {|a| z = a.zero? - n = a.nonzero? + n = a.nonzero + p = a.nonzero? if a == 0 assert_equal(true, z, "(#{a}).zero?") - assert_equal(nil, n, "(#{a}).nonzero?") + assert_equal(nil, n, "(#{a}).nonzero") + assert_equal(false, p, "(#{a}).nonzero?") else assert_equal(false, z, "(#{a}).zero?") - assert_equal(a, n, "(#{a}).nonzero?") + assert_equal(a, n, "(#{a}).nonzero") + assert_equal(true, p, "(#{a}).nonzero?") check_class(n) end - assert(z ^ n, "(#{a}).zero? ^ (#{a}).nonzero?") + assert(z ^ p, "(#{a}).zero? ^ (#{a}).nonzero?") } end