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?