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

Não acessa atributo

Olá pessoal, estou já a 1 hora tentando encontrar o problema e não o acho, aparentemente não consigo acessar o atributo "ano_lancamento" e, por isso, o meu programa não consegue efetuar o cálculo "@ano_lancamento < 2006", segue abaixo erro e código:

Erro: livro.rb:11:in calcula_preco': undefined method<' for nil:NilClass (NoMethodError) from livro.rb:5:in initialize' from livro.rb:38:innew' from livro.rb:38:in `' Código

class Livro
    attr_reader :titulo, :preco, :ano_lancamento
    def initialize(titulo, preco, ano_lancamento, possui_reimpressao)
        @titulo = titulo
        @preco = calcula_preco preco
        @ano_lancamento = ano_lancamento
        @possui_reimpressao = possui_reimpressao
    end
    private
    def calcula_preco(base)
        if @ano_lancamento < 2006
            if @possui_reimpressao
                base * 0.9
            else
                base * 0.95
            end
        elsif @ano_lancamento <= 2010
            base * 0.96
        else
            base
        end

    end

    def possui_reimpressao?
        @possui_reimpressao
    end
end

def exporta_csv(estoque)
    estoque.each do |livro|
        puts "#{livro.titulo},#{livro.ano_lancamento}"
    end
end

algoritmos = Livro.new("Algoritmos", 100, 1998, true)
arquitetura = Livro.new("Introdução À Arquitetura e Design de Software",70, 2011, true)

estoque = [algoritmos, arquitetura]
exporta_csv estoque
2 respostas
solução!

Boa tarde Luis,

O teu programa justamente não acha o valor de ano_lancamento porque você está definindo o valor dele após chamar a execução da função calcula_preco. Ao ser executada a função calcula_preco, o :ano_lancamento ainda possui valor nulo, e o método '<' não existe para atributos nulos. Como esta função necessita deste valor, basta inverter a ordem deles no teu initialize.

def initialize(titulo, preco, ano_lancamento, possui_reimpressao)
        @titulo = titulo
        @ano_lancamento = ano_lancamento
        @preco = calcula_preco preco
        @possui_reimpressao = possui_reimpressao
    end

Muito obrigado, funcionou

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software