В вашем коде не используется возвращаемое значение вашей функции input
; он исчезает в эфире, и у вашего абонента есть неопределенный n
, к которому он пытается получить доступ. Если вы напишите свой код вызова как:
res = Operation.new
res.fibonacci(res.input)
Затем вы передаете возвращаемое значение из res.input
в res.fibonacci
и ваша непосредственная проблема решена.
Помимо этого, я считаю, что в вашем коде есть примечательные проблемы дизайна, которые вы можете рассмотреть. Функции должны быть модульными и избегать побочных эффектов , таких как печать, что серьезно ограничивает их полезность и гибкость. Что если вы хотите сгенерировать числа Фибоначчи и использовать их для чего-то другого в вашей программе? Вы должны переписать всю функцию снова. Если вы напишите его один раз для заполнения и возврата массива, вы дадите вызывающей стороне решить, следует ли распечатать вывод, сохранить его в базе данных, отправить его через сокет, перевернуть его, отправить в другую функцию (вы понимаете).
Старайтесь избегать жестко заданных значений, таких как строка и числа. Ваша функция input
не может работать ни для чего, кроме сбора чисел Фибоначчи. Что если вы позволите звонящему решить, что это за сообщение? Затем, когда вы добавите больше математических функций в ваш класс Operation
, вы сможете повторно использовать ту же самую процедуру input
.
Я бы также утверждал, что такая функция, как input
, не принадлежит классу Operator
. Я вижу, что в этом классе она используется как служебная функция, но она не зависит от Operator
-подобных вещей и слишком мала, чтобы в любом случае гарантировать ее собственную функцию.
Вот переписать, что несколько смягчает эти проблемы:
module Fibonacci
class Operation
def input(message)
puts message
gets.chomp.to_i
end
def fibonacci(n)
num1 = 0
num2 = 1
result = []
while num2 < n
result << num2
num1, num2 = num2, num1 + num2
end
result
end
end
res = Operation.new
puts res.fibonacci(res.input 'Enter the number upto which Fibonacci needs to be printed:')
end
И примерный прогон:
Enter the number upto which Fibonacci needs to be printed:
15
1
1
2
3
5
8
13
Тест в этом repl .