Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

403
Visualizações
¿Ruby's reduce devuelve el acumulador con llaves?

Intenté implementar reduce usando llaves, pero no pude hacerlo funcionar. Se supone que la función toma una matriz de palabras (símbolos o cadenas) y crea un hash donde las claves son las palabras y los valores son la longitud de las palabras. Aquí está mi intento de llaves:

 def find_word_lengths(word_list) word_list.reduce(Hash.new(0)) { |hash,word| hash[word] = word.length} end

Sigo recibiendo el undefined method '[]=' for 3:Integer .

Cuando lo implemento con do en lugar de llaves, funciona, pero solo cuando devuelvo el acumulador al final del bloque de reducción.

 def find_word_lengths(word_list) word_list.reduce(Hash.new(0)) do |hash,word| hash[word] = word.length hash end end

Puedo ver por qué funciona el segundo, pero no entiendo por qué no funciona el primero. Mi comprensión de reduce es que devuelve el acumulador implícitamente después de ejecutar la matriz a la que se llama. Al menos, cuando escribo una llamada de función de reducción que se reduce a un número, automáticamente devuelve la suma

 my_numbers = [5, 6, 7, 8] my_numbers.reduce(1000) { |sum, number| sum + number } #=>1026

¿Reduce se comporta de manera diferente según el tipo de acumulador?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

En su primer ejemplo, devuelve el resultado de asignar word.length al hash[word] , es decir, word.length en sí misma. Por lo tanto, la iteración de la sección del ciclo recuperará la longitud de la primera palabra de su word_list como su argumento.

En su segundo ejemplo, está devolviendo explícitamente el hash en el bloque (que luego funciona).

Una versión equivalente de una sola línea con llaves para su versión funcional de varias líneas es

 word_list.reduce(Hash.new(0)) { |hash, word| hash[word] = word.length; hash }

En lugar de usar reduce , también podría usar each_with_object en su lugar, lo que siempre producirá el objeto original en cada iteración:

 word_list.each_with_object(Hash.new(0)) { |hash, word| hash[word] = word.length }
over 4 years ago · Santiago Trujillo Relatório

0

El acumulador NO se devuelve implícitamente. Esta es la suposición que rompe el resto de su análisis.

El se indica en los documentos si lee cuidadosamente:

... En cualquier caso, el resultado se convierte en el nuevo valor de memo . ..

De lo que se trata es del resultado de la ejecución del bloque, ya sean llaves o do/end , se convierte en el nuevo valor de memo en la siguiente ronda.

Entonces, tanto las llaves como do/end funcionan exactamente igual, solo que asumiste que la nota se devolvió implícitamente, cuando no es así.

Si analiza su código ahora con este nuevo conocimiento, debería comprender por qué algunos de los ejemplos funcionaron y otros no.

Recuerde, la última declaración dentro del bloque será el valor de la nota en la próxima iteración.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda