2
respostas

4. Enxugando seu código - Não há retorno (retorno vazio)

Quando executo o código, não retorna nada e não exibe nenhum erro...

livro.rb

class Livro
    attr_reader :titulo, :preco, :ano_lancamento, :editora, :tipo

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

    def possui_reimpressao?
        @possui_reimpressao
    end

    def to_csv
        "#{titulo}, #{ano_lancamento}, #{preco}"
    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

end

estoque.rb

require_relative 'contador'

class Estoque
    attr_reader :livros

    def initialize
        @livros = []
        @vendas = []
        @livros.extend Contador
    end

    def quantidade_de_vendas_por(produto, &campo)
        @vendas.count {|venda| campo.call(venda) == campo.call(produto)}
    end

    def livro_que_mais_vendeu_por_titulo
        que_mais_vendeu_por("livro", &:titulo)
    end

    def livro_que_mais_vendeu_por_ano
        que_mais_vendeu_por("livro", &:ano_lancamento)
    end

    def livro_que_mais_vendeu_por_editora
        que_mais_vendeu_por("livro", &:editora)
    end

    def revista_que_mais_vendeu_por_titulo
        que_mais_vendeu_por("revista", &:titulo)
    end

    def revista_que_mais_vendeu_por_ano_lancamento
        que_mais_vendeu_por("revista", &:ano_lancamento)
    end

    def revista_que_mais_vendeu_por_editora
        que_mais_vendeu_por("revista", &:editora)
    end

    def que_mais_vendeu_por(tipo, &campo)
        @vendas.select {|l| l.tipo == tipo}.sort {|v1,v2|
            quantidade_de_vendas_por(v1, &campo) <=> quantidade_de_vendas_por(v2, &campo)
        }.last
    end    

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

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

    def total
        @livros.size
    end

    def << (livro)
        @livros << livro if livro
        self
    end

    def vende(livro)
        @livros.delete livro
        @vendas << livro
    end

    def maximo_necessario
        @livros.maximo_necessario
    end

end

contador.rb

module Contador
    def << (livro)
      push (livro)
      if @maximo_necessario.nil? || @maximo_necessario < size
        @maximo_necessario = size
      end
      self
    end

    def maximo_necessario
        @maximo_necessario  
    end

    attr_reader :maximo_necessario
end

sistema.rb

require_relative 'livro'
require_relative 'estoque'

def livro_para_newsletter(livro)
    if livro.ano_lancamento < 1999
        puts "Newsletter/Liquidacao"
        puts livro.titulo
        puts livro.preco
        puts livro.possui_reimpressao?
    end
end

algoritmos = Livro.new("Algoritmos", 100, 1998, true, "", "Livro")
arquitetura = Livro.new("Introdução a Arquitetura e Design de Software", 70, 2011, true, "", "Livro")
programmer = Livro.new("The Pragmatic Programmer", 100, 1999, true, "", "Livro")
ruby = Livro.new("Programming Ruby", 100, 2004, true, "", "Livro")
revistona = Livro.new("Revista de Ruby", 10, 2012, true, "Revistas", "revista")

estoque = Estoque.new
estoque << algoritmos << algoritmos << ruby << programmer << arquitetura << ruby << ruby << revistona << revistona
estoque.vende ruby
estoque.vende algoritmos
estoque.vende algoritmos
puts estoque.livro_que_mais_vendeu_por_titulo.titulo
puts estoque.revista_que_mais_vendeu_por_titulo.titulo
2 respostas

Não sei por qual motivo, ao passar pelo capítulo 5.1 - Generalizando comportamentos através do method_missing, voltou a funcionar

Oi Cintia, então tá tudo funcionando, certo? Eu ia pedir seu projeto para testar, mas parece desnecessário no momento. Qualquer coisa estamos por aqui, tudo bem?

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