Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

217
Vistas
¿Por qué este % de error en Ruby? Aprendizaje para principiantes

Acabo de empezar con Ruby ayer. Vi algunos conceptos básicos en línea y comencé a hacer algunos desafíos de codificación para principiantes y uno pide encontrar números primos. Intento no usar la función principal que ya está en Ruby. Creo que casi lo tengo, pero no entiendo por qué aparece el error.

"18:in ': método indefinido %' para nil:NilClass (NoMethodError)"

Traté de modificarlo durante algunas horas y parece que no puedo encontrar soluciones en línea para esto... Uso Ruby 3.0.0, aquí está el código que logré compilar hasta ahora:

 nums = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] prime_nums = [] i = 0 #Loop on the array to check each element while i <= nums.length check = 0 divider = nums[i] #While to prevent DivisionByZero error while divider != 0 if nums[i] % divider == 0 #/!\ ERROR HERE check += 1 end divider -= 1 end #Only division by 1 and itself will increment $check if check == 2 prime_nums.append(nums[i]) end i += 1 end puts prime_nums
over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

En su ejemplo, significa que nums[i] devuelve nil, por lo que el caso es que i es mayor que 19.

Puede cambiar while i <= nums.length a while i < nums.length porque las matrices están indexadas desde 0 en Ruby.

over 4 years ago · Santiago Trujillo Denunciar

0

undefined method %' for nil:NilClass significa que está tratando de usar % en nil . nil es lo que obtienes cuando, por ejemplo, intentas obtener demasiado de un Array.

Si ponemos p "#{i}: #{nums[i]}" en el bucle, veremos que i llega a 20. Los arreglos comienzan a contar en 0, por lo que si tiene 20 elementos en un arreglo, el índice más alto es 19. num[20] es nil .

Puede arreglar esto con while i < nums.length para detenerse en 19.

Sin embargo, rara vez se escriben bucles while en Ruby. En su lugar, itera usando métodos. each itera a través de cada elemento de un Array. Y puedes contar hacia atrás con downto .

 nums.each do |num| check = 0 num.downto(1) do |divider| if num % divider == 0 check += 1 end end #Only division by 1 and itself will increment $check if check == 2 prime_nums.append(num) end end

Ahora no hay posibilidad de estar fuera por uno.

over 4 years ago · Santiago Trujillo Denunciar

0

La respuesta de @Schwern tiene excelentes consejos sobre el uso de métodos de iteración en Ruby. Podemos usarlos para hacer que su algoritmo sea mucho más eficiente.

 def is_prime?(num) 2.upto Math::sqrt(num) do |divisor| return false if num % divisor == 0 end true end

En lugar de iterar de num a 1 y hacer un seguimiento de los divisores, podemos comenzar desde 2 y trabajar hasta la raíz cuadrada de num . Si encontramos un divisor par, sabemos que no es primo y podemos devolver false inmediatamente, ahorrándonos el esfuerzo de iterar sobre algo más.

Si llegamos al final del bucle, sabemos que num debe ser primo y devolver true .

Entonces digamos que queremos imprimir números primos del 1 al 500 , podemos hacer:

 1.upto 500 do |num| puts num if is_prime? num end
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda