For all sin glitrende magi, kan ikke Ruby beskytte deg fra å gjøre feil og heller ikke fra alt som kan gå galt.
1| $livvakter = true 2| 3| def hent_kongen 4| if $livvakter 5| puts "Kanskje kommer Kongen..." 6| else 7| raise SecurityError, "Redd for bløtekake." 8| end 9| end 10| 11| begin 12| hent_kongen #=> "Kanskje kommer Kongen..." 13| $livvakter = false 14| hent_kongen #=> "Niks: Redd for bløtekake." 15| rescue SecurityError => error 16| puts "Niks: #{error}" 17| end |
Du kan også legge til en ensure-klausul som kjøres uansett om det heves et unntak eller ikke.
1| begin 2| kode_som_kaster_unntak 3| rescue SecurityError => error 4| puts "Sikkerhetsproblem: #{error}" 5| rescue 6| puts "En eller annen StandardError." 7| ensure 8| puts "Opprydning gjøres okke som." 9| end |
Regulære uttrykk (regular expressions) er en gjenganger blant skriptingsspråkene som gjør dem så perfekte til tekstmanipulering. Klassen Regexp
samler denne funksjonaliteten på en ryddig måte, men Ruby lar deg også bruke regexp literaler.
1| # Litt HTML tekst å lete i 2| html = '<UL> 3| <LI><IMG SRC="next.gif"></LI> 4| <LI><A HREF="index.html">Hei</A></LI> 5| </UL>' 6| 7| # Den ryddige måten å lage Regexp'er på: 8| r1 = Regexp.new('<IMG SRC=".*">') 9| puts r1.match( html ).to_s #=> '<IMG SRC="next.gif">' 10| 11| # Regexp-literaler 12| r2 = /<A HREF=".*">.*<\/A>/ # slash må escapes 13| puts r2.match( html ).to_s #=> '<A HREF="index.html">Hei</A>' 14| 15| # String-klassen har også en del metoder som tar imot 16| # ett Regexp-objekt, deriblant sub og gsub 17| antall_e = 0 18| "Hvor mange e'er er det i denne setningen?".scan(/e/){ |match| 19| antall_e += 1 20| } 21| puts "Totalt #{antall_e} e'er." #=> Totalt 9 e'er. |
Regulære uttrykk er nesten en vitenskap i seg selv. Dessuten er de omtrent like lesbare som det norske lovverket etter å ha gått igjennom en makuleringsmaskin og bør derfor brukes med omhu.
1| log = '[25/Apr/2004:09:21:07 +0200] "GET / HTTP/1.1" 200 3145' 2| 3| r = Regexp.new('\[(\d\d)\/(\w*)\/(\d{4}):' + # dato 4| '(\d{2}):(\d{2}):(\d{2})' + # tidspunkt 5| ' ([+-]\d{4})\]' # tidssone 6| ) 7| m = r.match log 8| puts m[1..7].join(", ") #=> 25, Apr, 2004, 09, 21, 07, +0200 |
(Det finnes en mer lesbar alternativ til POSIX regexp formatet som kan skrives over flere linjer med indentering.)