Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

ERRO

Olá! Estou tentando prosseguir com os exercícios, mas estou recebendo sempre o mesmo erro:

22:in `calcula_preco': undefined method `<' for nil:NilClass (NoMethodError)

Obrigada!

class Livro
  attr_reader :titulo,:preco, :ano

  def initialize(titulo, preco, ano, reimpressao)
    @titulo = titulo
    @preco = calcula_preco preco
    @ano = ano
    @reimpressao = reimpressao
  end

def to_csv
  "#{@titulo}, #{@ano}, #{@preco}"
end

def reimpressao?
  @reimpressao
end

private

def calcula_preco base
  if @ano < 2006
    if @reimpressao
      base * 0.9
    else
      base 0.95
    end
  elseif @ano <= 2010
    base * 0.96
    else
      base
    end
  end
end

def livro_para_newsletter livro
  if livro.ano < 1999
    puts "Newsletter/Liquidação"
    puts livro.titulo
    puts livro.preco
    puts livro.reimpressao
  end
end

class Estoque

  def initialize
    @livros = []
  end

def exporta_csv
    @livros.each do |livro|
      puts to_csv
    end
end

  def mais_barato_que valor
    @livros.select do |livro|
      livro.preco <= valor
    end
  end

  def total
    @livros.size
  end

  def adiciona livro
    @livros << livro if livro
  end
end

algoritmos = Livro.new("Algoritmos", 100, 1998, true)
arquitetura = Livro.new("Livro de Arquitetura", 70, 2011, true)

estoque = Estoque.new
estoque.adiciona << algoritmos
estoque.adiciona << arquitetura
estoque.adiciona = [algoritmos, arquitetura]
estoque.adiciona << Livro.new("The pragmatic programmer", 100, 1999, true)
estoque.adiciona << Livro.new("Programando com Ruby", 100, 2004, true)
estoque.adiciona livro

estoque.exporta_csv

baratos = estoque.mais_barato_que 80
baratos.each do |livro|
  puts livro.titulo
end
1 resposta
solução!

Testei aqui além do end a mais quando você está chamando o método calcula_preco quando ele tenta acessar o atributo @ano que ainda não foi definido gera o erro. Funcionará se você passar os atributos recebidos no initialize ou colocar a definição @preco como a última operação do initialize:

  def initialize(titulo, preco, ano, reimpressao)
    @titulo = titulo
    @ano = ano
    @reimpressao = reimpressao
    @preco = calcula_preco preco
  end

 def calcula_preco base
    if @ano > 2006
      if @reimpressao
       base * 0.9
      else
       base 0.95
      end  
    elsif @ano <= 2010
     base * 0.96
    else
     base
    end
  end

Espero que você tenha entendido.

Olá Rose! Dando uma olha sem testar... estou no tablet no momento. Tem um end a mais no calcula_frete depois do elseif, o else que seria da mesma estrutura de seleção esta identado dentro do elseif e possui um end solto com ele.

Faz só um mês que comecei no Ruby, mas me parece que isso. Vou testar aqui daqui pouco também.