Marcar como Lido
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 32 de 56.
Adicione a opção final, 4. Mark As Read. O usuário digita um título exato e o programa altera a chave :read desse livro de false para true.
Para encontrar o livro, use find: ele retorna o primeiro elemento que corresponde ao bloco, ou nil quando nada corresponde:
book = library.find { |b| b[:title] == query }Se book for nil, informe que nenhum livro foi encontrado. Caso contrário, modifique-o no local; hashes do Ruby compartilham sua identidade dentro do array, então atualizar book[:read] atualiza a entrada armazenada em library também.
Desafio
FácilEstenda o loop do menu com o ramo "4":
printo promptTitle:e leia-o- Use
findpara localizar o livro com esse título exato - Se não houver correspondência, imprima
Not found. - Caso contrário, defina
book[:read] = truee imprimaMarked as read!
Mantenha todos os ramos anteriores funcionando.
Para entradas que adicionam The Hobbit, marcam como lido e depois saem, o bloco de marcação imprime:
Choose an option: Title: Marked as read!Folha de consulta
Use find para localizar o primeiro elemento correspondente em um array (retorna nil se não for encontrado):
book = library.find { |b| b[:title] == query }Como os hashes compartilham identidade dentro de arrays, mutar o objeto encontrado atualiza a entrada original:
if book.nil?
puts "Not found."
else
book[:read] = true
puts "Marked as read!"
endExperimente você mesmo
library = []
loop do
puts "--- Library Manager ---"
puts "1. Add Book"
puts "2. Search By Title"
puts "3. Filter By Genre"
puts "4. Mark As Read"
puts "5. Exit"
print "Choose an option: "
choice = gets.chomp
if choice == "5"
puts "Goodbye!"
break
elsif choice == "1"
print "Title: "
title = gets.chomp
print "Author: "
author = gets.chomp
print "Genre: "
genre = gets.chomp
library.push({ title: title, author: author, genre: genre, read: false })
puts "Book added!"
elsif choice == "2"
print "Search title: "
query = gets.chomp
matches = library.select { |b| b[:title].downcase.include?(query.downcase) }
if matches.empty?
puts "No matches."
else
matches.each { |b| puts "#{b[:title]} by #{b[:author]}" }
end
elsif choice == "3"
print "Genre: "
genre = gets.chomp
matches = library.select { |b| b[:genre] == genre }
matches.each { |b| puts "#{b[:title]} by #{b[:author]}" }
puts "Total: #{matches.length}"
end
# TODO: lidar com choice == "4", buscar pelo título exato,
# definir book[:read] = true, exibir "Marked as read!" ou "Not found."
end
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica e Fluxo
1Strings a Fundo
Visão Geral de Métodos de StringInterpolação de StringsIterando sobre StringsSplit e JoinRecapitulação - String Weaver4Blocos, Procs e Lambdas
O que é um Bloco?do..end vs ChavesA palavra-chave yieldParâmetros de BlocoProcs e LambdasRecapitulação - Iterador Customizado7Hashes Parte 2
Hash.new com Valores PadrãoIterando em HashesHashes AninhadosMesclando e TransformandoRecapitulação - Contador de Frequência10Projeto - Registros de Alunos
Visão Geral do ProjetoAdicionar Aluno2Intervalos
O que é um Intervalo?Métodos de IntervaloIntervalos em Case / WhenRecapitulação - Prática com Intervalos5O Poder do Enumerable
Select e RejectEncadeando o MapReduce / Injectcount, all?, any?, none?group_by e partitionsort_by, min_by, max_byRecapitulação - Data Pipeline3Arrays 2D
Fundamentos de Arrays 2DAcessando Elementos 2DIterando sobre Arrays 2DPadrões 2D ComunsRecapitulação - Operações com Matrizes6Projeto - Gerenciador de Biblioteca
Visão Geral do ProjetoAdicionar Livro