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

Não estou conseguindo acessar o valor de uma função em outra.

Não estou conseguindo acessar o valor armazenado em uma função na outra, o código abaixo ilustra a minha dúvida:

def dados
  puts "Qual o seu nome?"
  nome = gets.chomp
 nome
end

def impressao
  puts "\n\n" + denominacao.upcase + " teste concluído."
end

denominacao = dados
impressao

O resultado da execução deste código segue abaixo:

Qual o seu nome?
edu
a1a.rb:8:in `impressao': undefined local variable or method `denominacao' for main:Object (NameError)
        from a1a.rb:12:in `<main>'

Gostaria de entender o que ocorreu e como devo proceder.

4 respostas

Olá Eduardo!

Não sou grande conhecedor de Ruby, porém, nas linguagens que já vi, você só consegue usar uma variável que ela foi declarada anteriormente e uma função pode ser usada antes mesmo do trecho em que ela foi escrita.

No seu código, tente usar a linha denominacao = dados no início do programa. Fazendo assim, é para reconhecer que existe a variável denominação.

Caso ainda assim não funcione, pode colocar a linha denominacao = dados antes de def impressao.

Ou seja, sempre que for usar uma variável dentro de uma função, que será utilizada fora da mesma, deve-se criar a variável antes da função.

Espero ter ajudado, mas se ficou confuso, estamos a disposição!

Complementando o que o Fabiano disse, para resolver o seu caso podemos usar o retorno de uma função dentro de outra, assim temos acesso.

def dados
  puts "Qual o seu nome?"
  nome = gets.chomp
  nome
end

def impressao
  puts "\n\n" + dados.upcase + " teste concluído."
end

impressao

Fabiano obrigado, valeu pela intenção, realmente ficou um pouco confuso para mim que sou iniciante.Mas o Felipe passou uma solução que para mim ficou um pouco mais compreensível. De fato, o código funcionou conforme o esperado, mas fiz uma pequena alteração:

def editar_dados
  puts "Qual o seu nome?"
  nome = gets.chomp
  return nome
end

def imprimir_dados
    puts "\n" + "seu nome foi armazenado".upcase
    puts editar_dados.upcase + " teste concluído."
end

imprimir_dados

e o resultado da execução deste código é:

SEU NOME FOI ARMAZENADO
Qual o seu nome?
edu
EDU teste concluído.

Não sei se estou entendendo direito, mas quando uma função é invocado dentro de outra função, o que ocorre é a execução da função invocada e não somente o valor desejado contido na função. Tentei seguir a orientação do Fabiano:

def editar_dados
  puts "Qual o seu nome?"
  nome = gets.chomp
  return nome
end
dado = editar_dados
def imprimir_dados
    puts "\n" + "seu nome foi armazenado".upcase
    puts dado.upcase + " teste concluído."
end

imprimir_dados

E o resultado é:

Qual o seu nome?
edu

SEU NOME FOI ARMAZENADO
apaga_fabiano.rb:9:in `imprimir_dados': undefined local variable or method `dado' for main:Object (NameError)
        from apaga_fabiano.rb:12:in `<main>'

Não consigo entender por que não consigo retornar apenas o valor da função. Peço desculpas por atormentá-los com essas pequenas dúvidas, mas tenho dificuldade em dar continuidade ao curso sem antes entender esta etapa direito.

solução!

Isso mesmo,

Estamos executando uma função dentro da outra, no caso da variável não funciona, porque não conseguimos acessar variáveis fora do escopo da função.