2011-10-18 2 views
5

зайчика камень для Solr имеет метод, который требует блок с 2-х элементов:Вводят с несколькими параметрами блока

search.each_hit_with_result do |hit,result| 

и я использую его, чтобы построить новый хэш результатов, как так:

results = Hash.new 

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

Это классно и все, но я не могу не думать о том, что есть более «рубиновый» способ сделать это, и я смотрел на потрясающий метод inject. Я думаю, что что-то вроде следующего должно быть возможным, но я не могу заставить его синтаксически работать. У кого-нибудь есть идеи?

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

Поиск карты в массив заголовков и оценка 2 массивов элементов, а затем использовать 'Hash [foo]' в этом массиве массивов. Я напишу это как правильный ответ позже сегодня. –

+0

Невредимый, tokland избил меня! –

ответ

1

Object#enum_for предназначен именно для этого:

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

На мой взгляд, код никогда не должен подвергать each_xyz методы, они способствует вонючий императивный код (как вы правильно обнаружен). Подобные методы были понятны, когда не было enumerators, и вам нужно было лениво возвращать данные, но теперь его следует рассматривать как анти-шаблон. Они должны возвращать перечислимый или перечислитель и позволить пользователю решить, как его использовать.

2

Я считаю, что метод выглядит как то, что вы хотите:

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

Надежда свою помощь вам.

+0

Да. Быстрый тест без SOLR: Hash.inject, похоже, ведет себя так же, как и каждый метод *, поскольку он пропускает 2 аргумента. Итак: {1 => 2, 3 => 4} .inject ({}) {| new_hash, current | new_hash [current [0]] = current [1]; new_hash} – inger

+1

Вы можете использовать each_with_object вместо инъекции. –

Смежные вопросы