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

Dúvida na utilização de "return"

Olá galeris! Tudo bem? Concluí este curso e agora estou reescrevendo o código quase que por conta própria, para fins de estudo e para verificar se surgem mais dúvidas ou questões. A resposta é sim! Estou com dúvida na utilização na função que criamos para verificar se os nossos carros ultrapassaram a tela. Na verdade, ainda estou meio incerto quando se trata da utilização de "return" dentro das nossas funções. Pelo que eu entendi, usamos quando queremos verificar se tal condição dentro da função é verdadeiro ou falso, correto? Seguindo com isso, quando estamos criando a função para verificar se os carros saíram da tela, por qual motivo não podemos fazer isso? (Testei e já vi que dá errado, mas queria entender o motivo):

//função para o carro voltar a aparecer na tela//
function backToInicialPositionCar(){
  for(let i = 0; i < carImages.length; i++){
    if(carExitTheScreen){
      xCars[i] = 600;
    }
  }
}

//função para verificar se carro saiu da tela//
function carExitTheScreen(){
  return xCars < - 50;
}

Nesse caso, por que não podemos utilizar a mesma variável que criamos lá no começo para fazer essa verificação? Utilizo outro exemplo para ilustrar a minha dúvida: Por que nesse caso abaixo, eu não preciso criar um nome diferente na função (que poderia ser qualquer um, pelo que entendi), e mesmo assim ainda informamos o parâmetro "yActor" dentro do nosso "if"?

//função para jogador controlar o ator//
function moveActor(){
  if(keyIsDown(UP_ARROW)){
    yActor -= 5;
  }
    if(keyIsDown(DOWN_ARROW)){
      if(actorCanMoveDOWN(yActor)){
      yActor += 5;
    }
  }
}

//função para ator não sair da tela na parte de baixo//
function actorCanMoveDOWN(){
  return yActor < 366;
}

Nesse caso, se eu preferir criar um outro nome, eu também posso, mas não é necessário. Acho que isso acaba me deixando confuso na hora de programar. Eu não entendo por que não podemos fazer algo assim, por exemplo:

//função para jogador controlar o ator//
function moveActor(){
  if(keyIsDown(UP_ARROW)){
    yActor -= 5;
  }
    if(keyIsDown(DOWN_ARROW)){
      if(actorCanMoveDOWN){
      yActor += 5;
    }
  }
}
//função para ator não sair da tela na parte de baixo//
function actorCanMoveDOWN(){
  return yActor < 366;
}

Desculpa pela explicação meio fajuta, eu ainda estou aprendendo a explicar minhas próprias dúvidas dentro da linguagem de programação! :(( Obrigado pela atenção!

7 respostas

Olá Gabriel! Tudo bem?

Primeiramente, parabéns por concluir o curso e por estar se dedicando a reescrever o código para fins de estudo. É assim que realmente aprendemos e fixamos o conhecimento, boa!

A utilização do "return" dentro das funções é muito importante para retornar um valor específico ou verificar uma condição. Ele tem diversos uso, mas em resumo usamos ele quando executamos uma função e ao final queremos que essa função retorno algo ou execute algo, uma função que verifica a posição do carro, queremos que caso esse carro passe do 500 no eixo X, esse carro retorne para a posição 0, o retorno retorna algo, isso faz com que economizamos muito código e facilita a manutenção, portanto ele trabalha com qualquer valor, seja ele int, bool ou string.

Portanto, qual a função do return. De forma mais técnica ela é usada para finalizar a execução de uma função e especificar os valores que devem ser retornados para onde a função foi chamada. Quando uma declaração return é usada em um corpo de função, a execução dessa função é parada. Se especificado, um dado valor é retornado à quem chamou a função. Se a expressão for omitida, undefined será retornado. Todas as declarações return a seguir param a execução da função.

Aqui está um exemplo de como funciona:

function minhaFuncao(a, b) {
  return a * b;   // A função retorna o produto de a e b
}

Assim, é possível considerar que o valor de a seja 10 e b seja 10. O return armazena o valor 100, então, ao executarmos um console.log, com a execução da função(console.log(minhaFuncao(10,10))) o valor será 100, da mesma forma que uma calculadora que sempre retorna um cálculo, ou valor, correto?

No exemplo que você citou, não é possível utilizar a mesma variável "carExitTheScreen" para fazer a verificação, pois essa variável é uma função e não um valor. Portanto, é necessário chamá-la utilizando os parênteses "()". Assim, a função será executada e o valor retornado poderá ser utilizado na condição do "if".

No caso da função "actorCanMoveDOWN", acontece algo similar. Ela é uma função que retorna "true" se a posição do ator for menor que 366, indicando que ele pode se mover para baixo, e ai vemos a riqueza do return, ele é usado para verificar, neste caso ele só vai fornecer duas resposta true or false. Nesse caso, é possível utilizar a função diretamente na condição do "if" sem a necessidade de criar uma variável intermediária.

Entendo que isso possa gerar confusão, mas é importante lembrar que as funções são chamadas para serem executadas e retornarem um valor. Então, quando você utiliza o nome da função seguido dos parênteses, você está chamando a função e obtendo o resultado dela.

Aqui estão alguns materiais que podem ajudar você a entender o uso do return em JavaScript:

Espero ter esclarecido suas dúvidas! Se surgirem mais questionamentos, fique à vontade para perguntar. Estou aqui para ajudar. Continue praticando e estudando, pois a prática é fundamental para o aprendizado. Você está no caminho certo!

Sucesso

Um grande abraço e até mais!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Olá Victor! Obrigado pela resposta, explicação e indicação de outros materiais para estudos. Lendo o que você escreveu, acabei ficando com uma outra dúvida aqui:

No caso abaixo, por que não usamos o "return" na função "actorBackToInitialPosition()"?

/função para verificar se houve colisão entre o ator e carros - p5.collide2d//
function verifyCollisionActorCars(){
  for(let i = 0; i < carImages.length; i++){
    hit = collideRectCircle(xCars[i], yCars[i], carLength, carHeight, xActor, yActor, 15);
      if(hit){
    actorBackToInitialPosition();
    }
  }
}

//função para fazer ator voltar para posição inicial//
function actorBackToInitialPosition(){
  yActor = 366;
}

Queria entender por que fazer o código conforme esse próximo exemplo não gera o mesmo resultado que a primeira forma:

//função para verificar se houve colisão entre o ator e carros - p5.collide2d//
function verifyCollisionActorCars(){
  for(let i = 0; i < carImages.length; i++){
    hit = collideRectCircle(xCars[i], yCars[i], carLength, carHeight, xActor, yActor, 15);
      if(hit){
    actorBackToInitialPosition(yActor);
    }
  }
}

//função para fazer ator voltar para posição inicial//
function actorBackToInitialPosition(yCow){
  return yCow = 366;
}

Muito obrigado mais uma vez pela respota, ajudou muito na compreensão da minha dúvida :)) Abraço!

solução!

Olá Gabriel!

Fico feliz em saber que minha resposta anterior ajudou você a entender parte da sua dúvida.

No primeiro exemplo de código que você mostrou, a função actorBackToInitialPosition() não usa o return porque ela apenas atualiza o valor da variável yActor para 366. Nesse caso, não há necessidade de retornar um valor, pois a função já realiza a modificação desejada diretamente na variável, a função ou ela executa, ou ela retorna, ou ambos é claro, ai nesse ponto acho que você está se confundindo, já estive na sua posição e sei como pode ser confuso, nesse caso a função altera diretamente a variável sem precisar de um retorno pois sua execução já faz isso, o retorno é quando queremos um valor ao final da execução. Por conta disso deixo um execício de reflexão: Imagine que você está em um restaurante e pede um prato de comida. O chef prepara o prato e o entrega para você. O prato é como o valor que é retornado por uma função. Quando você come o prato, você está consumindo o valor que foi retornado pela função.

Agora imagine que você pede um prato de comida e o chef prepara o prato, mas não o entrega para você. Em vez disso, ele apenas atualiza a descrição do prato no menu. Nesse caso, não há valor sendo retornado pelo chef, pois ele não entregou nada para você. Da mesma forma, quando uma função não usa o return, ela pode estar atualizando uma variável ou fazendo outra coisa sem retornar um valor.

No segundo exemplo, você tentou usar o return na função actorBackToInitialPosition(yCow), mas há um pequeno erro de sintaxe. A linha return yCow = 366; está atribuindo o valor 366 à variável yCow e, em seguida, tenta retornar esse valor. No entanto, essa linha não está correta, porque você não pode atribuir um valor a um parâmetro de função.

Se você deseja modificar o valor de yActor dentro da função actorBackToInitialPosition(yCow) e retornar o novo valor, você pode fazer o seguinte:

function actorBackToInitialPosition(yCow){
  yCow = 366;
  return yCow;
}

No entanto, nesse caso específico, como você está passando a variável yActor como argumento para a função actorBackToInitialPosition(), e a função não retorna nada, a modificação de yCow dentro da função não terá impacto na variável yActor fora da função. Portanto, o segundo exemplo de código não terá o mesmo resultado que o primeiro.

Espero ter esclarecido sua dúvida!

Eu fiquei com dúvida no Return tambem.

Porque ele usa:

return xCarro < -50.

A lógica da função é essa? SE o xCarro for menor que -50, ENTAO o carro passou por toda a tela. e então ele entra no for acima. É isso?

A parte que não entendi, é o "xCarro" . Ele nao foi definido em lugar nenhum. Como o sistema sabe o que é o xCarro?

Olá Daniel, blz?

O operador < em JavaScript é um operador de comparação que retorna true se o valor do lado esquerdo for menor que o valor do lado direito. Caso contrário, ele retorna false.

a função passouTodaATela(xCarro) verifica se o valor de xCarro é menor que -50. Se for, a função retorna true, o que significa que o carro passou por toda a tela. Se não for, a função retorna false.

A variável xCarro é definida como um parâmetro da função passouTodaATela(xCarro). Quando a função é chamada, o valor do argumento passado para ela é atribuído à variável xCarro. O valor de xCarro é definido como o valor de xCarros[i], onde i é um índice que varia de 0 a 5.

Espero ter ajudado!

Boa tarde. Ajudou entender o aspecto de True e False.

Mas ficou uma dúvida ainda.

O X definido anteriormente é a lista (xCarros).

Ai definimos como parâmetro da função: passouTodaATela(xCarro). Mas como que o sistema entende que o 'x' do xCarro, pertence aos 'x' da lista xCarros? Essa está sendo minha dificuldade.... não foi definido nada de x de xCarro antes....

nao sei se estou sendo confuso demais. kkk

Opa Daniel!

Na função passouTodaATela(xCarro), o parâmetro xCarro é apenas um nome escolhido para representar o valor que será passado como argumento quando a função for chamada, poderia ser qualquer nome e talvez isso esteja lhe confundindo, portanto, o sistema não adivinha ele apenas recebe um valor no parâmetro através da chamada da função if (passouTodaATela(xCarros[i])) que por sinal é do eixo X de algum carro que está na lista e verifica se esse valor é menor que - 50, quando for ele vai retorna o true e não outro valor e se for true, ai sim o X do carro recebe um novo valor que é o 600.

Em resumo, o nome xCarro na função passouTodaATela(xCarro) é apenas um nome local escolhido para representar o valor que será passado como argumento quando a função for chamada. Ele não tem relação direta com o nome do array xCarros. O valor é passado como argumento para a função e pode ser utilizado internamente com o nome do parâmetro escolhido.

Deixo um material para saber mais sobre parâmetro na função.

Espero ter esclarecido mais um pouco, abraços!