Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

218
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda