5
respostas

Duvida!!!

Olá quendo eu executo o meu código me deparo com o seguite erro :

C:/Users/mateus viana/Videos/Ruby/exercisiosAlura/Curso Ruby Orienta��o Objeto/Sistema De Compras de Livros/Sistema.rb: C:/Users/mateus viana/Videos/Ruby/exercisiosAlura/Curso Ruby Orientação Objeto/Sistema De Compras de Livros/Estoque.rb:28: syntax error, unexpected ',', expecting ')' (SyntaxError) que_mais_vendeu_por(&:titulo , "LIVRO") ^

C:/Users/mateus viana/Videos/Ruby/exercisiosAlura/Curso Ruby Orientação Objeto/Sistema De Compras de Livros/Estoque.rb:28: syntax error, unexpected ')', expecting keyword_end que_mais_vendeu_por(&:titulo , "LIVRO") ^

C:/Users/mateus viana/Videos/Ruby/exercisiosAlura/Curso Ruby Orientação Objeto/Sistema De Compras de Livros/Estoque.rb:32: syntax error, unexpected ',', expecting ')' def que_mais_vendeu_por( &campo , tipo)

segue meu código abaixo :

Estoque.rb

require_relative 'Contador.rb'

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 que_mais_vendeu_por(tipo , &campo)

      @vendas.select {|produto| produto.tipo == tipo}.sort {|v1 , v2|

        quantidade_de_vendas_por(v1 , &campo) <=> quantidade_de_vendas_por(v2 , &campo)

      }.last

    end

    def livro_que_mais_vendeu_por_editora()

      que_mais_vendeu_por("LIVRO" , &:editora)

    end

    def livro_que_mais_vendeu_por_ano()

      que_mais_vendeu_por("LIVRO", &:ano_lancamento)

    end

    def livro_que_mais_vendeu_por_titulo()

      que_mais_vendeu_por("LIVRO" , &:titulo)

    end

    def revista_que_mais_vendeu_por_editora()

      que_mais_vendeu_por("REVISTA" , &:eitora)

    end

    def revista_que_mais_vendeu_por_ano()

      que_mais_vendeu_por("REVISTA" ,&:ano_lancamento)

    end

    def revista_que_mais_vendeu_por_titulo()

      que_mais_vendeu_por("REVISTA" , &:titulo)

    end


    def exporta_csv()

      @livros.each do |livro|

        livro.to_csv

      end

    end

    def mais_baratos_que(valor)

      @livros.select do |livro|

      livro.preco <= valor

      end

    end

    def vende(livro)

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

    def maximo_necessario()

      @livros.maximo_necessario

    end



    def total()

      @livros.size

    end

    def <<(livro)

      if livro

        @livros << livro

      end

      self

    end

Livro.rb

class Livro

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

  def initialize(titulo , preco , ano_lancamento , possui_reimpressao , editora , tipo)

    @titulo = titulo
    @preco = preco
    @ano_lancamento = ano_lancamento
    @preco = calcula_preco(preco)
    @possui_reimpressao = possui_reimpressao
    @editora = editora
    @tipo = tipo

  end

  def possui_reimpressao?()

    return @possui_reimpressao

  end

  def to_csv()

    puts ("\n")
    puts ("|-----------------------------------------------------------------|")
    puts ("| #{@titulo},#{@ano_lancamento},#{@preco}")
    puts ("|-----------------------------------------------------------------|")

  end

  private

  def calcula_preco(base)

    if @ano_lancamento < 2006

      if @possui_reimpressao

        return base *= 0.90

      else

        return base *= 0.95

      end

    elsif @ano_lancamento <= 2010

      return base *= 0.96

    else

      return base

    end

  end

end

  def imprime_nota_fiscal(livros)

    puts ("\n\n")
    puts ("|-----------------------------------------------------------------|")
    puts ("| LIVROS EM ESTOQUE :                                             |")
    puts ("|-----------------------------------------------------------------|")

    livros.each do |livro|

      puts ("\n")
      puts ("|---------------------------------------------------------------|")
      puts ("|TITUTO DO LIVRO : #{livro.titulo}")
      puts ("|PREÇO DO LIVRO : #{livro.preco}")
      puts ("|ANO DE LANÇAMENTO : #{livro.ano_lancamento}")
      puts ("|---------------------------------------------------------------|")

    end

  end


  def mostra_newslatter(livro)

    if livro.ano_lancamento < 2000

      puts ("\n\nLIVROS DA NEWSLATTER")
      puts ("\nTITULO : #{livro.titulo}")
      puts ("\nPREÇO : #{livro.preco}")
      puts ("\nANO DE LANÇAMENTO : #{livro.ano_lancamento}")

    end

Sistema.rb

require_relative 'Livro.rb'
require_relative 'Estoque.rb'

agile = Livro.new("AGILE WEB DEVELOPMENT WITH RAILS",70.0,1999 , true , "CASA DO CÓDIGO" , "LIVRO")
desing_software = Livro.new("INTRODUÇÃO À ARQUITETURA E DESING DE SOFTWARE" ,70.0, 2011,true , "LEYA" , "LIVRO")
ruby = Livro.new("PROGRAMING RUBY",50.0,2010,true , "LEYA" , "LIVRO")

estoque = Estoque.new
estoque << agile
estoque << desing_software
estoque << ruby
estoque.vende(ruby)
puts estoque.livro_que_mais_vendeu_por_titulo.titulo

Contador.rb

module Contador

  attr_reader :maximo_necessario

  def << (livro)

    push(livro)

    if @maximo_necessario.nil? || @maximo_necessario < size

      @maximo_necessario = size

    end

    self

  end

  def maximo_necessario()

    return @maximo_necessario


  end

end

se alguem souber como resolver por favor me ajude .....

5 respostas

Olá.

Na sua função que_mais_vendeu_por você não fecha a chave de sort. Tente deixá-la assim:

def que_mais_vendeu_por(tipo , &campo)

      @vendas.select {|produto| produto.tipo == tipo}.sort { |v1 , v2| }

        quantidade_de_vendas_por(v1 , &campo) <=> quantidade_de_vendas_por(v2 , &campo)

      }.last

    end

desculpe não copiei o código certo

segue o código abaixo :

Sistema.rb

require_relative 'Livro.rb'
require_relative 'Estoque.rb'

agile = Livro.new("AGILE WEB DEVELOPMENT WITH RAILS",70.0,1999 , true , "CASA DO CÓDIGO" , "LIVRO")
desing_software = Livro.new("INTRODUÇÃO À ARQUITETURA E DESING DE SOFTWARE" ,70.0, 2011,true , "LEYA" , "LIVRO")
ruby = Livro.new("PROGRAMING RUBY",50.0,2010,true , "LEYA" , "LIVRO")

estoque = Estoque.new
estoque << agile
estoque << desing_software
estoque << ruby
estoque.vende(ruby)
puts estoque.livro_que_mais_vendeu_por_titulo.titulo

Estoque.rb

require_relative 'Contador.rb'

class Estoque

  attr_reader :livros

  def initialize()

    @livros = []
    @livros.extend(Contador)
    @vendas = []

  end


  def mais_baratos_que(valor)

    @livros.select do |livro|

      livro.preco <= valor

    end

  end

  def livro_que_mais_vendeu_por_titulo

    que_mais_vendeu_por( &:titulo , "LIVRO")

  end

  def que_mais_vendeu_por(&campo , tipo)

    @vendas.select{|l| l.tipo == tipo}.sort {|v1 , v2|}

      quantidade_de_vendas_por(v1 , &:campo) <=> quantidade_de_vendas_por(v2 , &:campo)

    }.last

  end

  def quantidade_de_vendas_por(livro , &campo )

    @vendas.count {|venda|  campo.call(venda) == campo.call(livro) }

  end

  def total

    return @livros.size

  end

  def exporta_csv()


    @livros.each do |livro|

      livro.to_csv

    end


  end


  def <<(livro)

    if livro

      @livros << livro

    end

    self
  end

  def vende(livro)

    @livros.delete(livro)
    @vendas << livro

  end

end

Livro.rb

class Livro

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

  def initialize(titulo , preco , ano_lancamento , possui_reimpressao , editora , tipo)

    @titulo = titulo
    @preco = preco
    @ano_lancamento = ano_lancamento
    @preco = calcula_preco(preco)
    @possui_reimpressao = possui_reimpressao
    @editora = editora
    @tipo = tipo

  end

  def possui_reimpressao?()

    return @possui_reimpressao

  end

  def to_csv()

    puts ("\n")
    puts ("|-----------------------------------------------------------------|")
    puts ("| #{@titulo},#{@ano_lancamento},#{@preco}")
    puts ("|-----------------------------------------------------------------|")

  end

  private

  def calcula_preco(base)

    if @ano_lancamento < 2006

      if @possui_reimpressao

        return base *= 0.90

      else

        return base *= 0.95

      end

    elsif @ano_lancamento <= 2010

      return base *= 0.96

    else

      return base

    end

  end

end

  def imprime_nota_fiscal(livros)

    puts ("\n\n")
    puts ("|-----------------------------------------------------------------|")
    puts ("| LIVROS EM ESTOQUE :                                             |")
    puts ("|-----------------------------------------------------------------|")

    livros.each do |livro|

      puts ("\n")
      puts ("|---------------------------------------------------------------|")
      puts ("|TITUTO DO LIVRO : #{livro.titulo}")
      puts ("|PREÇO DO LIVRO : #{livro.preco}")
      puts ("|ANO DE LANÇAMENTO : #{livro.ano_lancamento}")
      puts ("|---------------------------------------------------------------|")

    end

  end


  def mostra_newslatter(livro)

    if livro.ano_lancamento < 2000

      puts ("\n\nLIVROS DA NEWSLATTER")
      puts ("\nTITULO : #{livro.titulo}")
      puts ("\nPREÇO : #{livro.preco}")
      puts ("\nANO DE LANÇAMENTO : #{livro.ano_lancamento}")

    end

  end

Contador.rb

module Contador

  attr_reader :maximo_necessario

  def << (livro)

    push(livro)

    if @maximo_necessario.nil? || @maximo_necessario < size

      @maximo_necessario = size

    end

    self

  end

  def maximo_necessario()

    return @maximo_necessario


  end

end

Olhe esse trecho:

def que_mais_vendeu_por(&campo , tipo)

    @vendas.select{|l| l.tipo == tipo}.sort {|v1 , v2|}

      quantidade_de_vendas_por(v1 , &:campo) <=> quantidade_de_vendas_por(v2 , &:campo)

    }.last

  end

A última chave (antes do .last) não está fechando nada. Ela deveria fechar a chave do select, mas você está fechando o select antes do sort. Tem que ver direito onde você quer fechar...

Olá Bruno , eu corrigi meu código , que no final ficou dessa maneira :

Estoque.rb

def que_mais_vendeu_por(&campo , tipo)

    @vendas.select{|l| l.tipo == tipo.sort {|v1 , v2|}

      quantidade_de_vendas_por(v1 , &:campo) <=> quantidade_de_vendas_por(v2 , &:campo)

    }.last

  end

mas continua me rotornando os mesmos erros quando eu o executo

Mesmo erro e mesma linha?