count, all?, any?, none?
Parte da seção Lógica e Fluxo do Journey de Ruby da Coddy — lição 24 de 56.
Quatro pequenos métodos Enumerable que respondem perguntas sobre uma coleção sem forçar você a escrever um loop.
count retorna quantos elementos satisfazem o bloco:
[1, 2, 3, 4, 5].count { |n| n.even? } # 2
[1, 2, 3, 4, 5].count # 5 (sem bloco, contagem total)all? é verdadeiro quando cada elemento satisfaz o bloco:
[2, 4, 6].all? { |n| n.even? } # true
[2, 4, 7].all? { |n| n.even? } # falseany? é verdadeiro quando pelo menos um satisfaz a condição:
[1, 2, 3].any? { |n| n.even? } # true
[1, 3, 5].any? { |n| n.even? } # falsenone? é verdadeiro quando nenhum deles satisfaz a condição:
[1, 3, 5].none? { |n| n.even? } # trueOs métodos realizam curto-circuito, any? para na primeira correspondência, all? para na primeira falha. Eles são baratos.
Desafio
FácilLeia uma lista de pontuações de testes separadas por vírgulas (inteiros). Uma turma é uma valid passing class quando:
none?das pontuações é negativa (um teste não registrado)all?as pontuações são no máximo100any?pontuação é exatamente100(pelo menos uma pontuação perfeita)- pelo menos 3 pontuações são
>= 70(usecount)
Imprima exatamente uma linha:
Valid: <count> passingquando todas as quatro condições forem atendidas (counté a contagem de pontuações>= 70)Invalidcaso contrário
Para a entrada 72,80,100,65,90: 4 pontuações >= 70, nenhuma negativa, todas <= 100, uma é 100, então a saída é Valid: 4 passing.
Para 72,80,90: 3 aprovadas mas nenhuma pontuação perfeita, então Invalid.
Folha de consulta
Quatro métodos Enumerable que respondem a perguntas sobre uma coleção:
count – retorna quantos elementos satisfazem o bloco (ou o tamanho total sem um bloco):
[1, 2, 3, 4, 5].count { |n| n.even? } # 2
[1, 2, 3, 4, 5].count # 5all? – verdadeiro quando todos os elementos satisfazem o bloco:
[2, 4, 6].all? { |n| n.even? } # trueany? – verdadeiro quando pelo menos um elemento satisfaz o bloco:
[1, 2, 3].any? { |n| n.even? } # truenone? – verdadeiro quando nenhum elemento satisfaz o bloco:
[1, 3, 5].none? { |n| n.even? } # trueEstes métodos possuem curto-circuito: any? para na primeira correspondência, all? para na primeira falha.
Experimente você mesmo
scores = gets.chomp.split(",").map(&:to_i)
# TODO: combinar all?, any?, none?, count para decidir Válido vs Inválido
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 Pipeline