MCVE (Ejemplo mínimo, completo y verificable) para reproducir el mismo problema que el mío:
en el lugar del archivo rspec:
RSpec.describe 'Predicate Enumerable Exercises' do describe 'coffee drink exercise' do it 'returns true when espresso is included' do drink_list = ["milk", "juice", "espresso"] expect(coffee_drink?(drink_list)).to be true end end describe 'valid scores exercise' do it 'returns true when only one score is a 10' do score_list = { easy_to_read: 10, uses_best_practices: 8, clever: 7 } perfect_score = 10 expect(valid_scores?(score_list, perfect_score)).to be true end end enden el archivo de funciones reales:
def coffee_drink?(drink_list) drink_list.include?("coffee" || "espresso") end def valid_scores?(score_list, perfect_score) score_list.one?{|score| score == perfect_score} endTengo dificultades para averiguar qué es lo que está mal en mi código porque confío en métodos integrados (¿uno?, ¿incluir?), así que no estoy seguro de cuál es el problema real.
Creé 2 métodos, coffee_drink?(drink_list) y valid_scores?(score_list, perfect_score) .
coffee_drink? obtiene una matriz, que luego devuelve verdadero solo si incluye la palabra coffee o espresso . Utilicé lo siguiente para devolver lo esperado: drink_list.include?("coffee" || "espresso") Pero cuando tengo espresso en mi lista y no tengo coffee , la consola devuelve:
devuelve verdadero cuando se incluye espresso (FAILED - 1)
Donde drink_list es ["milk", "juice", "espresso"]
Para valid_scores? obtiene una matriz y un entero, y devuelve verdadero cuando solo un valor en la matriz es igual a ese entero. Pero esperaba que score_list.one?{|score| score == perfect_score} devolvería verdadero cuando solo un valor es verdadero. En cambio, obtengo:
devuelve verdadero cuando solo una puntuación es 10 (FALLIDO - 2)
donde esta la matriz
score_list = { easy_to_read: 10, uses_best_practices: 8, clever: 7 }y el entero es
perfect_score = 10Estoy usando Ruby 2.7.2p137 (2020-10-01 revisión 5445e04352) [x86_64-linux] si eso ayuda.
¿Tu include? el código se comporta diferente de lo esperado porque:
"coffee" || "espresso" #=> "coffee" # so drink_list.include?("coffee" || "espresso") # evaluates to drink_list.include?("coffee") ¿Tendrás que usar 2 include? llamadas, o alguna otra opcion comoany? o & .
drink_list.include?("coffee") || drink_list.include?("espresso") # or drink_list.any? { |drink| drink == "coffee" || drink == "espresso" } drink_list.any?(/\A(coffee|espresso)\z/) (drink_list & ["coffee", "espresso"]).size.positive? # !(...).empty? also works ¿Tu one? el código se comporta diferente de lo esperado porque score_list no es una matriz, sino un hash (diccionario/mapa en otros idiomas). Un hash consta de pares clave/valor que se pasan como matriz ( [key, value] ) al one? cuadra.
score_list.one? { |pair| pair.last == perfect_score }Alternativamente, puede usar la descomposición de matrices :
score_list.one? { |key, value| value == perfect_score } O recupere solo losvalues de antemano:
score_list.values.one? { |score| score == perfect_score }