Escribí un método de la serie de Fibonacci e intenté llamarlo. Funciona bien con el siguiente código:

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

Pero quiero tener un método separado para aceptar entradas dentro de la clase y llamarlo.

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

Obteniendo un error! .. Soy un novato, Sería útil si recibiera un soporte ... Gracias

-1
Shan_Boy 10 sep. 2018 a las 09:02

3 respuestas

La mejor respuesta

Tal como está, su código no utiliza el valor de retorno de su función input; desaparece en el éter y su interlocutor tiene un n indefinido al que está intentando acceder. Si escribe su código de llamada como:

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

Luego, pasa el valor de retorno de res.input a res.fibonacci y se resuelve su problema inmediato.

Más allá de esto, creo que hay problemas de diseño notables en su código que puede considerar. Las funciones deben ser modulares y evitar efectos secundarios como la impresión, que limita severamente Utilidad y flexibilidad. ¿Qué sucede si desea generar números de Fibonacci y usarlos para otra cosa en su programa? Tienes que reescribir toda la función nuevamente. Si lo escribe una vez para completar y devolver una matriz, deja que la persona que llama decida si imprime el resultado, lo guarda en una base de datos, lo envía a través de un socket, lo invierte, lo envía a otra función (se le ocurre la idea).

Procure evitar los valores codificados como cadenas y números. Su función input no puede funcionar para nada más que recolectar números de Fibonacci. ¿Qué pasa si deja que la persona que llama decida cuál es el mensaje? Luego, cuando agrega más funciones matemáticas a su clase Operation, puede reutilizar la misma rutina input.

También afirmaría que una función como input no pertenece a una clase Operator. Puedo ver que se usa como una función de utilidad en esa clase, pero es independiente de Operator, como cosas y es demasiado pequeña para garantizar su propia función en cualquier caso.

Aquí hay una reescritura que mitiga algo estos problemas:

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

Y una muestra de ejecución:

Enter the number upto which Fibonacci needs to be printed:
 15
1
1
2
3
5
8
13

Pruebe en este repl.

0
ggorlen 10 sep. 2018 a las 06:46

Cambiar código a:

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

Y elimine res.fibonacci(n).

Aquí está el código completo:

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

Espero que esto haya ayudado.

0
Ravi Teja Dandu 10 sep. 2018 a las 06:17

Podría ser increíblemente útil si ha especificado qué error exacto tiene, pero déjeme adivinar: es un poco "NameError: variable local indefinida o método` n '"

Eso sucede porque no ha pasado un argumento en su llamada a fibonacci. Tiene una opción para recurrir a obtener la variable de la entrada del usuario si no se especificó ninguna:

  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
Aleksei Matiushkin 10 sep. 2018 a las 06:28