Enumerable#otherwise

Geplaatst door Remco van 't Veer vr, 07 nov 2008 11:02:00 GMT

Hoe vaak heb je niet iets als het volgende geschreven?


if results.empty?
  puts "no results" 
else
  results.each do |result|
    puts "- #{result}" 
  end
end

In een poging om alle lijsten in een web applicatie te kunnen voorzien van een mededeling dat de lijst leeg is, zijn we tot de volgende constructie gekomen:


results.each do |result|
  puts "- #{result}" 
end.otherwise do
  puts "no results" 
end

Door simpelweg Enumerable uit te breiden met:


module Enumerable
  def otherwise
    empty? ? yield : self
  end
end

Hiermee kan je ook:


results = search_terms.otherwise{['kittens']}.map{|term| search(term)}

Als je de otherwise methode ook nog eens in de NilClass stopt maakt het zelfs niet meer uit of search_terms in het bovenstaande voorbeeld nil of een lege collectie is.

Geplaatst in ,  | 4 reacties

Reacties

  1. Justin Halsall zei ongeveer 1 uur later:

    Goed idee! Dit is echt veel beter dan de eindeloze if else statements!

  2. Jan zei ongeveer 2 uur later:

    results << ‘no results’ if results.empty? results.each do |result| puts ”#{result}” end

    Kan toch ook? Zit er sowieso dan altijd eentje in.

  3. Remco zei ongeveer 4 uur later:

    Jan: met het kleine verschil dat er voor resultaten een minnetje staat en niet voor “no results”. Op jouw manier kan de gebruiker geen onderscheid maken tussen een resultaat “no results” en daadwerkelijk “no results”

  4. Manfred zei 27 dagen later:

    We hebben iets vergelijkbaars ook een tijdje geleden in een Ruby Banter gedaan: http://media.fngtps.com/rubybanter/2008/008.

(Laat url/e-mail achter »)

   Voorvertoning