В Ruby нет неявного преобразования Fixnum в String (TypeError) to_i не работает

Я изучаю Ruby и пытаюсь решить следующую задачу:

Напишите метод, который принимает целое число num и возвращает сумму всех целых чисел от нуля до num, включая num.

Я придумал:

def sum_nums(num)
    sum = ""
    num = num.to_i
    if num > 0
        while num > 0
            sum = sum + num
            num = num - 1
        end
    end
    if num == 0
        sum = 0 
    end
    if num < 0
        while x < 0
            sum = sum + num
            num = num + 1
        end
    end
    return sum 
end

Получал ошибку строки Fixnum в 6-й строке и не мог устранить неполадки самостоятельно. Я попытался преобразовать num в целое число, хотя это не имело для меня смысла, поскольку я писал подобные методы, не требующие to_i. Но совершенно потерял очевидную вещь, которую мне не хватает.


person lasalla    schedule 28.06.2016    source источник
comment
Вы не можете добавлять строки и числа, поэтому, хотя вы, возможно, раньше не использовали to_i, вы также не делали ничего подобного. Вы либо начинали с двух чисел, либо выполняли конкатенацию строк.   -  person meagar    schedule 28.06.2016
comment
Только один вопрос: сообщение об ошибке говорит вам, что ему нужна строка, но получает число, и вы пытаетесь решить эту проблему путем преобразования в число? Почему? Он сообщает вам, что он уже получил число, так что вы знаете, что это уже число, и это неверно, он ожидает строку вместо.   -  person Jörg W Mittag    schedule 28.06.2016


Ответы (1)


Ваша ошибка является результатом попытки добавить строку "" с номером num.

В отличие от JavaScript, который пытается преобразовывать типы, Ruby не позволяет вам использовать разные типы с математическими операторами (если только они не являются числовыми, такими как float или integer).

Исправьте строку 2, чтобы сказать: sum = 0.

person Petr Gazarov    schedule 28.06.2016
comment
@LeeEames: В дополнение к комментарию @PetrGazarov, подумайте, действительно ли num = num.to_i это то, что вам нужно. Вы говорите, что ваш метод принимает целое число. Если это так, то нет причин применять to_i. Если это не так, то есть если ваш метод также принимает другие типы данных, кроме Integer, подумайте о возможных случаях и о том, действительно ли подходит to_i. Например, когда num передается строка "25abc", преобразование to_i не вызывает исключения, а молча игнорирует буквы и просто возвращает 25. Это может быть или не быть тем, что вам нужно. - person user1934428; 28.06.2016