Je cherche un moyen plus élégant de mélanger deux ensembles de résultats SQL avec un rapport donné. Dans chacun d'eux, je veux qu'ils soient traités dans le même ordre qu'ils arrivent, mais je veux entrelacer le traitement pour obtenir le mélange souhaité.
J'ai réalisé que cela pouvait être transformé en une méthode très générique fonctionnant avec deux enums et produisant des éléments à traiter. J'ai donc écrit cette méthode dont je suis à la fois assez fier (belle solution générique) et assez honteux.
def combine_enums_with_ratio(enum_a, enum_b, desired_ratio)
a_count = 1
b_count = 1
a_finished = false
b_finished = false
loop do
ratio_so_far = a_count / b_count.to_f
if !a_finished && (b_finished || ratio_so_far <= desired_ratio)
begin
yield enum_a.next
a_count += 1
rescue StopIteration
a_finished = true
end
end
if !b_finished && (a_finished || ratio_so_far > desired_ratio)
begin
yield enum_b.next
b_count += 1
rescue StopIteration
b_finished = true
end
end
break if a_finished && b_finished
end
end
Honteux parce que c'est clairement écrit dans un style très impératif. Ce n'est pas très ruby. Peut-être qu'il y a un moyen d'utiliser l'une des méthodes déclaratives de bouclage de Ruby, mais elles ne semblent pas fonctionner en tenant deux enums ouverts comme ceci. Alors je crois que je dois sauver une exception dans le cadre d'un flux de contrôle comme celui-ci, ce qui semble très sale. Il me manque la méthode de java hasNext()
méthode.
Y a-t-il un meilleur moyen ?
J'ai trouvé une question similaire sur en comparant enums : Ruby - Comparer deux énumérateurs de manière élégante . Quelques réponses compactes, mais pas particulièrement de résolution, et mon problème impliquant des longueurs inégales et des rendements inégaux semble plus délicat.