Ряд Фибоначчи с использованием классов и методов - PullRequest
0 голосов
/ 10 сентября 2018

Я написал метод ряда Фибоначчи и попытался вызвать его. Он отлично работает со следующим кодом:

module Fibonacci
  class Operation
    def fibonacci(n)
      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
end

  res = Operation.new
  puts 'Enter the number upto which Fibonacci needs to be printed:'
  n = gets.chomp.to_i
  res.fibonacci(n)
end

Но я хочу иметь отдельный метод для принятия входных данных внутри класса и вызова его.

module Fibonacci
  class Operation
    def input
    puts 'Enter the number upto which Fibonacci needs to be printed:'
    n = gets.chomp.to_i
    end
    def fibonacci(n)
      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
end

  res = Operation.new
  res.input
  res.fibonacci(n)
end

Получение ошибки! .. Я новичок, было бы полезно, если бы я получил поддержку .. Спасибо

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Это может быть невероятно полезно, если вы укажете , какая именно ошибка у вас, но позвольте мне догадаться: это вроде «NameError: неопределенная локальная переменная или метод` n '»

Это происходит потому, что вы не передали аргумент в своем вызове fibonacci. У вас есть возможность вернуться к получению переменной из пользовательского ввода, если ничего не было указано:

  class Operation
    def input
      puts 'Enter the number upto which Fibonacci needs to be printed:'
      gets.chomp.to_i
    end

    def fibonacci(n = -1)
      # HERE
      n = input if n <= 0

      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
  end

  res = Operation.new
  res.fibonacci(5)
  #⇒ 1 1 2 3

  res.fibonacci
  #⇒ 'Enter the number ...'
0 голосов
/ 10 сентября 2018

В вашем коде не используется возвращаемое значение вашей функции 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 .

0 голосов
/ 10 сентября 2018

Изменить код на:

def input
  puts 'Enter the number upto which Fibonacci needs to be printed:'
  n = gets.chomp.to_i
  fibonacci(n)
end

И удалить res.fibonacci(n).

Вот полный код:

module Fibonacci
  class Operation
    def input
    puts 'Enter the number upto which Fibonacci needs to be printed:'
    n = gets.chomp.to_i
    fibonacci(n)
    end

    def fibonacci(n)
      num1 = 0
      num2 = 1
      while num2 < n
        puts num2
        num1, num2 = num2, num1 + num2
      end
    end
end

  res = Operation.new
  res.input
end

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...