En riktig juvel som lades till Ruby v. 1.9 är objektsmetoden ‘tap’. Metoden är intressant i två bemärkelser, dels för att implementeringen av den visar på en av Rubys absoluta fördelar och dels för dess smidiga användning.
Vi kan börja med den senare punkten. Säg att vi har en uträkning som denna:
(i + 3) * ((j - k) / 5)
Det lämnas till läsaren att fantisera ihop någon kontext där den skulle kunna fylla någon som helst funktion, men förutsättningen är i någon form av loop i vilken de olika variablerna får olika värden. Låt nu säga att utfallet inte blir det som förväntas och att misstanken faller på deluttrycket (j – k). För att debugga detta, kräver de flesta språk en lösning i vilken uttrycket delas upp, i Ruby (utan ‘tap’) skulle detta se ut ungefär så här:
a = (j – k)
puts ”debug: #{a}”
(i + 3) * (a / 5)
I just detta fall är detta kanske inget större ingrepp på koden, men det finns många sammanhang i vilket det kan behövas många liknande bearbetningar av koden och jämför man med ‘tap’ lösningen framstår det som onödigt omständigt:
(i + 3) * ((j – k).tap {|a| puts ”debug: #{a}”} / 5)
Med denna justering kommer resultatet av (j – k) skrivas ut och vill man koppla in det hela i ett debug-system, är det bara att ändra puts till ett funktionsanrop för debuggning. För den som ställer sig frågan om något faktiskt är vunnet kommer här svaret: Ja. Den stora skillnaden är att kod läggs till, utan något omarbetning. Det gör arbetet med att debugga existerande kod betydligt mycket enklare, både sådan man själv skrivit, men framförallt sådan skriven inom större projekt med flera utvecklare.
Som sagt är ‘tap’ en objektsmetod, så den är oberoende av vilken typ objektet är, så följande exempel (från Programming Ruby 1.9 – The Pragmatic Programmers’ Guide):
puts ”dog”.reverse.tap {|o| puts ”Reversed: #{o}”}.capitalize
vilket ger:
Reversed: god
God
För den som missat det, kan det påpekas att allt i Ruby är objekt (del i klassen Object), inklusive textsträngar ”direkt” i koden, det är alltså ingen skillnad i utfallet på:
a = ”dog”
puts a.reverse
och
puts ”dog”.reverse
Just denna del i språket möjliggör den enkla implementeringen av metoden:
class Object
def tap
yield self
self
end
end
Eftersom ‘Object’ redan är deklarerat lägger denna bit kod endast till metoden ‘tap’ till alla objekt i klassen ‘Object’. Allt metoden gör, är att ”skicka” objektet till kod blocket {|a| puts ”debug: #{a}”} (i det första exemplet) och returnera objektet så som det kom in.
Väldigt enkelt och smart nog för att till 1.9 versionen av Ruby bli en del av standarden, så nu behöver man inte ens lägga till metoden själv.
Tap-metoden i Ruby
Etiketter:
Programmering, Ruby



