Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Dúvida na lógica

No código abaixo, gostaria de entender o que aconteceria se o rand sorteasse um número 0. Ele retornaria esse valor ao numero_escolhido, que por sua vez seria subtraído em -1, gerando um valor negativo.

def escolhe_palavra_secreta_sem_usar_muita_memoria
    avisa_escolhendo_palavra
    arquivo = File.new("dicionario.txt")
    quantidade_de_palavras = arquivo.gets.to_i
    numero_escolhido = rand(quantidade_de_palavras)
    for linha in 1..(numero_escolhido-1)
        arquivo.gets
    end
    palavra_secreta = arquivo.gets.strip.downcase
    arquivo.close
    avisa_palavra_escolhida(palavra_secreta)
end
3 respostas

Olá Thiago,

Em Ruby, quando especificamos uma expressão do tipo a..b, estamos definindo uma sequência. Por exemplo, a expressão 1..4 vai gerar a sequência: [1,2,3,4]. Mas e se tentarmos gerar a sequência 1..-1? Nesse caso, o resultado seria: [].

Na linha abaixo, por exemplo:

for linha in 1..4

A variável linha vai assumir os valores 1, 2, 3 e 4 em cada iteração do for por causa da sequência gerada por 1..4. Se utilizarmos a outra expressão 1..-1, a sequência [] será gerada então a variável linha não vai assumir valor algum e portanto o for não será executado nenhuma vez.

Acredito que no código acima, a intenção era somar 1 ao invés de subtrair para evitar esse erro.

Pois é Jeferson, concordo com tua sugestão no final do seu comentário. Ainda estou um pouco confuso com o uso do for no ruby, em algumas situações vi utilizarem:

for linha in 1..4

em outras, vi da seguinte forma:

for linha = 1..4

A diferença entre as duas formas é meramente sintaxe ou há algum uso particular mais apropriado para alguma? Obrigado pelo feedback!

solução!

Olá Thiago,

Realmente eu só conheço a primeira alternativa para o for no Ruby e não sei se a segunda é válida. Fiz uma pesquisa rápida e não consegui encontrar nada a respeito dessa sintaxe alternativa. Você se lembra onde você viu essa outra forma? Assim podemos tentar descobrir como funciona.