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.
Goed idee! Dit is echt veel beter dan de eindeloze if else statements!
results << ‘no results’ if results.empty? results.each do |result| puts ”#{result}” end
Kan toch ook? Zit er sowieso dan altijd eentje in.
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”
We hebben iets vergelijkbaars ook een tijdje geleden in een Ruby Banter gedaan: http://media.fngtps.com/rubybanter/2008/008.