2011-10-18 19 views
5

La gema de manchas solares de Solr tiene un método que requiere un bloque con 2 elementos:Inyectar con múltiples parámetros de bloque

search.each_hit_with_result do |hit,result| 

y lo estoy usando para construir una nueva almohadilla de los resultados, así:

results = Hash.new 

search.each_hit_with_result do |hit,result| 
    results[result.category.title] = hit.score 
end 

Esto es genial y todo, pero no puedo dejar de pensar que hay una forma más 'ruby' de hacerlo y he estado mirando el impresionante método inject. Creo que algo como lo siguiente debería ser posible, pero no puedo lograr que funcione sintácticamente. ¿Alguien tiene alguna idea?

search.each_hit_with_result.inject({}) 
{|newhash,|hit,result||newhash[result.category.title]=hit.score} 
+0

Busque en el mapa una matriz de títulos y obtenga 2 matrices de elementos, y luego use 'Hash [foo]' en esa matriz de matrices. Escribiré esto como una respuesta adecuada más adelante hoy. –

+0

¡Nevermind, tokland me ganó! –

Respuesta

1

Object#enum_for está diseñado precisamente para esto:

hit_results = search.enum_for(:each_hit_with_result) 
results = Hash[hit_results.map { |hit, res| [res.category.title, hit.score] }] 

En mi opinión, el código se lo debe someter each_xyz métodos, que promueve el código imperativo mal olor (como se detecta con razón). Ese tipo de métodos eran comprensibles cuando no había enumerators y necesitabas devolver los datos perezosamente, pero ahora debería considerarse un antipatrón. Deben devolver un enumerable o enumerador y dejar que el usuario decida cómo usarlo.

2

creo que el método se parece a lo que quieres:

search.each_hit_with_result.inject({}) { |new_hash, current| new_hash[current[0]] = current[1]; new_hash } 

Espero su ayuda.

+0

Sí. Prueba rápida sin SOLR: Hash.inject parece comportarse igual que cada método * en que pasa 2 args. Entonces: {1 => 2, 3 => 4} .inject ({}) {| new_hash, actual | new_hash [actual [0]] = actual [1]; new_hash} – inger

+1

Puede usar cada_con_objeto en lugar de inyectar. –

Cuestiones relacionadas