В 1 минуту времени, что я решил провести над вопросом, я не мог понять, что случилось с вашим кодом. Но я был в состоянии написать этот метод, который делает что-то похожее на то, что вы хотите сделать:
class Integer
def harm
return 0 if self == 0
return -(-self).harm if self < 0
(1 .. self).map { |n| Rational 1, n }.reduce :+
end
end
0.harm #=> 0
2.harm #=> 3/2
7.harm #=> 363/140
-2.harm #=> (-3/2)
Примечания, однако, что для большого числа, это очень читаемый код становится неэффективным, так как он готовит массив в памяти перед выполнением суммирования.
он делает именно то, что вы ему говорите. Говорить, что он «не суммирует правильно», вводит в заблуждение. – sevenseacat