From 823000910d3ef3dcdc6218ab52252a4277d91bd3 Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Wed, 24 Dec 2025 15:15:49 +0900 Subject: [PATCH 1/5] Fix "method redefined" warnings for sum method Fixes #43 --- ext/enumerable/statistics/extension/statistics.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/ext/enumerable/statistics/extension/statistics.c b/ext/enumerable/statistics/extension/statistics.c index 63b559c..f0fbc07 100644 --- a/ext/enumerable/statistics/extension/statistics.c +++ b/ext/enumerable/statistics/extension/statistics.c @@ -103,7 +103,7 @@ static VALUE sym_auto, sym_left, sym_right, sym_sturges; static VALUE cHistogram; -static VALUE orig_enum_sum, orig_ary_sum; +static ID id_builtin_enum_sum, id_builtin_ary_sum; inline static VALUE f_add(VALUE x, VALUE y) @@ -800,7 +800,7 @@ ary_calculate_sum(VALUE ary, VALUE init, int skip_na, long *na_count_out) * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `ary` includes Float values. * - * Note that This library does not redefine `sum` method introduced in Ruby 2.4. + * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__builtin_sum`. * * @return [Number] A summation value */ @@ -817,7 +817,7 @@ ary_sum(int argc, VALUE* argv, VALUE ary) #ifndef HAVE_ENUM_SUM if (!skip_na) { - return rb_funcall(orig_ary_sum, rb_intern("call"), argc, &v); + return rb_funcall(ary, id_builtin_ary_sum, argc, &v); } #endif @@ -1263,7 +1263,7 @@ enum_sum_count(VALUE obj, VALUE init, int skip_na, VALUE *sum_ptr, long *count_p * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `enum` includes Float values. * - * Note that This library does not redefine `sum` method introduced in Ruby 2.4. + * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__builtin_sum`. * * @return [Number] A summation value */ @@ -1283,7 +1283,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj) enum_sum_count(obj, init, skip_na, &sum, NULL); } else { - rb_funcall(orig_enum_sum, rb_intern("call"), argc, &init); + return rb_funcall(obj, id_builtin_enum_sum, argc, &init); } #else enum_sum_count(obj, init, skip_na, &sum, NULL); @@ -2530,9 +2530,10 @@ Init_extension(void) mEnumerableStatistics = rb_const_get_at(rb_cObject, rb_intern("EnumerableStatistics")); - orig_enum_sum = rb_funcall(rb_mEnumerable, rb_intern("public_instance_method"), 1, rb_str_new_cstr("sum")); - orig_ary_sum = rb_funcall(rb_cArray, rb_intern("public_instance_method"), 1, rb_str_new_cstr("sum")); + id_builtin_enum_sum = rb_intern("__builtin_sum"); + id_builtin_ary_sum = rb_intern("__builtin_sum"); + rb_define_alias(rb_mEnumerable, "__builtin_sum", "sum"); rb_define_method(rb_mEnumerable, "sum", enum_sum, -1); rb_define_method(rb_mEnumerable, "mean_variance", enum_mean_variance_m, -1); rb_define_method(rb_mEnumerable, "mean", enum_mean, 0); @@ -2541,6 +2542,7 @@ Init_extension(void) rb_define_method(rb_mEnumerable, "stdev", enum_stdev, -1); rb_define_method(rb_mEnumerable, "value_counts", enum_value_counts, -1); + rb_define_alias(rb_cArray, "__builtin_sum", "sum"); rb_define_method(rb_cArray, "sum", ary_sum, -1); rb_define_method(rb_cArray, "mean_variance", ary_mean_variance_m, -1); rb_define_method(rb_cArray, "mean", ary_mean, -1); From a683667ad3e8801cece0c7d9d1410e730ed251c8 Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Wed, 24 Dec 2025 15:54:50 +0900 Subject: [PATCH 2/5] Add sum method to README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 7408d31..852d285 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ require 'enumerable/statistics' The following methods are supplied by this library: +- `Array#sum`, `Enumerable#sum` + - Calculates a sum of values in an array or an enumerable + - Supports `skip_na: true` to skip `nil` and `NaN` values - `Array#mean`, `Enumerable#mean` - Calculates a mean of values in an array or an enumerable - `Array#variance`, `Enumerable#variance` From e93e3a28bd05f3b53ac03940fdab381a7fb2fae0 Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Wed, 24 Dec 2025 16:10:15 +0900 Subject: [PATCH 3/5] Fix enum_sum to store rb_funcall result, not return it Co-authored-by: Sutou Kouhei --- ext/enumerable/statistics/extension/statistics.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/enumerable/statistics/extension/statistics.c b/ext/enumerable/statistics/extension/statistics.c index f0fbc07..932ffb0 100644 --- a/ext/enumerable/statistics/extension/statistics.c +++ b/ext/enumerable/statistics/extension/statistics.c @@ -1283,7 +1283,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj) enum_sum_count(obj, init, skip_na, &sum, NULL); } else { - return rb_funcall(obj, id_builtin_enum_sum, argc, &init); + sum = rb_funcall(obj, id_builtin_enum_sum, argc, &init); } #else enum_sum_count(obj, init, skip_na, &sum, NULL); From a91f717bf2c6abaa85afdcf7713c9c1956b9539d Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Wed, 24 Dec 2025 16:39:18 +0900 Subject: [PATCH 4/5] Use __sum__ as internal sum alias --- .../statistics/extension/statistics.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/ext/enumerable/statistics/extension/statistics.c b/ext/enumerable/statistics/extension/statistics.c index 932ffb0..515f5df 100644 --- a/ext/enumerable/statistics/extension/statistics.c +++ b/ext/enumerable/statistics/extension/statistics.c @@ -103,7 +103,7 @@ static VALUE sym_auto, sym_left, sym_right, sym_sturges; static VALUE cHistogram; -static ID id_builtin_enum_sum, id_builtin_ary_sum; +static ID id_builtin_sum; inline static VALUE f_add(VALUE x, VALUE y) @@ -800,7 +800,7 @@ ary_calculate_sum(VALUE ary, VALUE init, int skip_na, long *na_count_out) * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `ary` includes Float values. * - * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__builtin_sum`. + * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__sum__`. * * @return [Number] A summation value */ @@ -817,7 +817,7 @@ ary_sum(int argc, VALUE* argv, VALUE ary) #ifndef HAVE_ENUM_SUM if (!skip_na) { - return rb_funcall(ary, id_builtin_ary_sum, argc, &v); + return rb_funcall(ary, id_builtin_sum, argc, &v); } #endif @@ -1263,7 +1263,7 @@ enum_sum_count(VALUE obj, VALUE init, int skip_na, VALUE *sum_ptr, long *count_p * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `enum` includes Float values. * - * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__builtin_sum`. + * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__sum__`. * * @return [Number] A summation value */ @@ -1283,7 +1283,7 @@ enum_sum(int argc, VALUE* argv, VALUE obj) enum_sum_count(obj, init, skip_na, &sum, NULL); } else { - sum = rb_funcall(obj, id_builtin_enum_sum, argc, &init); + sum = rb_funcall(obj, id_builtin_sum, argc, &init); } #else enum_sum_count(obj, init, skip_na, &sum, NULL); @@ -2530,10 +2530,9 @@ Init_extension(void) mEnumerableStatistics = rb_const_get_at(rb_cObject, rb_intern("EnumerableStatistics")); - id_builtin_enum_sum = rb_intern("__builtin_sum"); - id_builtin_ary_sum = rb_intern("__builtin_sum"); + id_builtin_sum = rb_intern("__sum__"); - rb_define_alias(rb_mEnumerable, "__builtin_sum", "sum"); + rb_define_alias(rb_mEnumerable, "__sum__", "sum"); rb_define_method(rb_mEnumerable, "sum", enum_sum, -1); rb_define_method(rb_mEnumerable, "mean_variance", enum_mean_variance_m, -1); rb_define_method(rb_mEnumerable, "mean", enum_mean, 0); @@ -2542,7 +2541,7 @@ Init_extension(void) rb_define_method(rb_mEnumerable, "stdev", enum_stdev, -1); rb_define_method(rb_mEnumerable, "value_counts", enum_value_counts, -1); - rb_define_alias(rb_cArray, "__builtin_sum", "sum"); + rb_define_alias(rb_cArray, "__sum__", "sum"); rb_define_method(rb_cArray, "sum", ary_sum, -1); rb_define_method(rb_cArray, "mean_variance", ary_mean_variance_m, -1); rb_define_method(rb_cArray, "mean", ary_mean, -1); From 1c7a50d1ac436ccc4e41d3ee4597a9f342a421ca Mon Sep 17 00:00:00 2001 From: Sutou Kouhei Date: Wed, 24 Dec 2025 16:49:41 +0900 Subject: [PATCH 5/5] Use ASCII --- ext/enumerable/statistics/extension/statistics.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/enumerable/statistics/extension/statistics.c b/ext/enumerable/statistics/extension/statistics.c index 515f5df..3006fdf 100644 --- a/ext/enumerable/statistics/extension/statistics.c +++ b/ext/enumerable/statistics/extension/statistics.c @@ -800,7 +800,7 @@ ary_calculate_sum(VALUE ary, VALUE init, int skip_na, long *na_count_out) * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `ary` includes Float values. * - * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__sum__`. + * Redefines `sum` (Ruby >= 2.4). Original is aliased as `__sum__`. * * @return [Number] A summation value */ @@ -1263,7 +1263,7 @@ enum_sum_count(VALUE obj, VALUE init, int skip_na, VALUE *sum_ptr, long *count_p * [Kahan summation algorithm](https://en.wikipedia.org/wiki/Kahan_summation_algorithm) * to compensate the result precision when the `enum` includes Float values. * - * Redefines `sum` (Ruby ≥ 2.4). Original is aliased as `__sum__`. + * Redefines `sum` (Ruby >= 2.4). Original is aliased as `__sum__`. * * @return [Number] A summation value */