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

If não precisa comparar valores no Ruby?

Salve galera, fiquei em dúvida nesse código do Ruby:

acertou = numero_secreto == chute.to_i if acertou puts "Acertou!" else puts "Errou!" end

Entendi que a variável acertou é o resultado da comparação do chute com o número secreto, devolvendo true ou false. O que eu não entendi é o if. Por quê não preciso colocar if acertou = true para cair no puts correto? Se acertou é false eu não teria if false puts acertou, dando um resultado errado?

3 respostas

Porque o padrão já é true, então não precisa colocar (variavel = true), são iguais.

solução!

Isso é uma facilitação usada em muitas linguagens. Em vez de usar acertou = true, podemos omitir a comparação e simplesmente usar (acertou), é exatamente a mesma coisa. Podemos igualmente usar isso para o caso false. acertou = false pode ser "abreviado" como (!acertou), já que o operador ! irá resultar no "oposto" de acertou, ou seja, false.

Em qualquer linguagem de programação, o IF vai ler a EXPRESSÃO que você passar pra ele, e tentar interpretar ela como VERDADEIRO ou FALSO, porque, no fim, é apenas isso que você precisa, saber se uma coisa aconteceu não, pra daí tomar uma decisão. Por exemplo:

SE acontecer X, então faça isso, senão faça aquilo.

acontecer X deve retornar verdadeiro ou falso. Aconteceu ou Não Aconteceu?

Então, utilizamos essa técnica (se é que eu posso chamar assim) pra melhorar a leitura do código:

ao invés disso: if (numero_secreto == chute) ...

usamos isso:

acertou = numero_secreto == chute 
if (acertou) ...

Veja que, no fim das contas, é a mesma coisa, mas a leitura do código melhorou. Você "guardou na cabeça" que a variável acertou quer dizer uma coisa, e em outra parte do código, você quer saber se essa coisa aconteceu. Assim fica mais fácil de entender certas partes do código.

Um exemplo um pouco mais próximo no mundo real:

cliente_bloqueado = verificar_cliente(cliente)
tem_estoque =  verificar_estoque(produto)
tem_preco = verificar_preco(produto)
tem_imagem = verificar_imagem(produto)

pode_comprar = !cliente_bloqueado and (tem_estoque and tem_preco and tem_imagem)

if pode_comprar
    abre_pagina_produto(produto)
else
    abre_pagina_404()
end

veja que a leitura é muito mais fácil que isso:

if !cliente_bloqueado and (tem_estoque and tem_preco and tem_imagem)
    abre_pagina_produto(produto)
else
   abre_pagina_404()
end

Você guardou na cabeça o que a variável pode_comprar quer dizer, e fica mais fácil de lembrar se um determinado produto está comprável ou não. E você ainda pode reutilizar essa variável em outras partes do seu código, sem precisar repetir várias vezes a mesma comparação.